Spring找不到名为entityManagerFactory的bean

发布于 2024-12-13 17:15:20 字数 8244 浏览 1 评论 0原文

我有一个使用 spring 和 hibernate 来支持 JPA 的 Web 应用程序,但是当我打开索引页面时,会发生此异常:

http:// astebin.com/0X1GG9GQ

但我认为我的 applicationContext.xml 配置良好,但我还是发布它只是为了确定:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            ">

    <!-- properties file for jdbc database access details / -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- enabling annotation driven configuration / -->
    <context:annotation-config />

    <context:component-scan base-package="com.maegul" />

    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
        p:username="${jdbc.username}" p:password="${jdbc.password}" />


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
        <property name="persistenceUnitName" value="maegul"></property>
    </bean>

    <bean id="jpaAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
        p:database="${jpa.database}" p:showSql="${jpa.showSql}" />

</beans>

我真的不知道出了什么问题,我一直在更改一些小东西无济于事,任何帮助将不胜感激。

编辑(pastebin中的长堆栈以便于阅读...)

更改了ApplicationContext.xml中的一些内容,现在我得到了不同的堆栈跟踪:

INFO  - Server                     - jetty-7.5.0.v20110901
INFO  - tandardDescriptorProcessor - NO JSP Support for {}, did not find {}
INFO  - /                          - Initializing Spring root WebApplicationContext
INFO  - ContextLoader              - Root WebApplicationContext: initialization started
INFO  - XmlWebApplicationContext   - Refreshing Root WebApplicationContext: startup date [Sun Nov 06 13:22:53 COT 2011]; root of context hierarchy
INFO  - XmlBeanDefinitionReader    - Loading XML bean definitions from ServletContext resource [/WEB-INF/ApplicationContext.xml]
INFO  - DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
INFO  - DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
ERROR - ContextLoader              - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.maegul.data.dao.impl.MediaItemDao com.maegul.service.implementation.ItemFindService.mediaItemDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediaItemDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0

此处堆栈的其余部分:http://pastebin.com/u82n3C5n

我看到我所做的注释正在被识别,但看起来它仍然找不到实体管理器工厂。我看到的一件事是,也许我不应该在 EntityManager 字段中使用 @PersistenceContext,而是使用 @PersistenceUnit,但我不知道。 ..

编辑 2

我的所有 DAO 实现如下所示:

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.maegul.data.dao.AbstractDAO;
import com.maegul.data.entities.MediaItem;

@Repository(value = "mediaItemDao")
public class MediaItemDaoImpl extends AbstractDAO<MediaItem> implements
        MediaItemDao {

    @PersistenceContext
    private EntityManager em;

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.DAO#getEntityManager()
     */
    public EntityManager getEntityManager() {
        return em;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.DAO#getClazz()
     */
    public Class<MediaItem> getClazz() {
        return MediaItem.class;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.impl.MediaItemDao#findByName(java.lang.String)
     */
    public MediaItem findByName(String name) {
        Query q = getEntityManager().createQuery(
                "select u from " + getClazz() + " where u.name = :name");
        q.setParameter("name", name);

        return (MediaItem) q.getSingleResult();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.impl.MediaItemDao#findByType(java.lang.String)
     */
    @SuppressWarnings("unchecked")
    public List<MediaItem> findByType(String type) {
        Query q = getEntityManager().createQuery("select u from " + getClazz() + " where u.type = :type");
        q.setParameter("type", type);

        return q.getResultList();
    }
}

编辑 3

这是 AbstractDAO 类:http://pastebin.com/f2BQG9RE

这是 DAO 接口,它是由 AbstractDAO 实现的: http://pastebin.com/h7dAHTTC

这是接口 MEdiaItemDao:

import java.util.List;

import com.maegul.data.dao.DAO;
import com.maegul.data.entities.MediaItem;

public interface MediaItemDao extends DAO<MediaItem>{

    MediaItem findByName(String name);

    List<MediaItem> findByType(String type);
}

I have a web application that uses spring and hibernate for JPA support, but when I open my Index page this exception happens:

http://pastebin.com/0X1GG9GQ

But I think my applicationContext.xml is well configured, but I'm posting it anyways just to be sure:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            ">

    <!-- properties file for jdbc database access details / -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- enabling annotation driven configuration / -->
    <context:annotation-config />

    <context:component-scan base-package="com.maegul" />

    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
        p:username="${jdbc.username}" p:password="${jdbc.password}" />


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
        <property name="persistenceUnitName" value="maegul"></property>
    </bean>

    <bean id="jpaAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
        p:database="${jpa.database}" p:showSql="${jpa.showSql}" />

</beans>

I really don't know what's wrong, I've been changing little things to no avail, any help would be greatly appreciated.

EDIT (Long Stack in pastebin for easier reading...)

Changed some things in the ApplicationContext.xml and now I get a different stack trace:

INFO  - Server                     - jetty-7.5.0.v20110901
INFO  - tandardDescriptorProcessor - NO JSP Support for {}, did not find {}
INFO  - /                          - Initializing Spring root WebApplicationContext
INFO  - ContextLoader              - Root WebApplicationContext: initialization started
INFO  - XmlWebApplicationContext   - Refreshing Root WebApplicationContext: startup date [Sun Nov 06 13:22:53 COT 2011]; root of context hierarchy
INFO  - XmlBeanDefinitionReader    - Loading XML bean definitions from ServletContext resource [/WEB-INF/ApplicationContext.xml]
INFO  - DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
INFO  - DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
ERROR - ContextLoader              - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.maegul.data.dao.impl.MediaItemDao com.maegul.service.implementation.ItemFindService.mediaItemDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediaItemDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0

Rest of stack here: http://pastebin.com/u82n3C5n

I see that the Annotations I made are getting recognized, but it looks like it can't still find an entityManagerFactory. One thing I've seen is that maybe instead of using @PersistenceContext should I use @PersistenceUnit in my EntityManager fields, but I dont know...

EDIT 2

All my DAO implementations look like this:

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.maegul.data.dao.AbstractDAO;
import com.maegul.data.entities.MediaItem;

@Repository(value = "mediaItemDao")
public class MediaItemDaoImpl extends AbstractDAO<MediaItem> implements
        MediaItemDao {

    @PersistenceContext
    private EntityManager em;

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.DAO#getEntityManager()
     */
    public EntityManager getEntityManager() {
        return em;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.DAO#getClazz()
     */
    public Class<MediaItem> getClazz() {
        return MediaItem.class;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.impl.MediaItemDao#findByName(java.lang.String)
     */
    public MediaItem findByName(String name) {
        Query q = getEntityManager().createQuery(
                "select u from " + getClazz() + " where u.name = :name");
        q.setParameter("name", name);

        return (MediaItem) q.getSingleResult();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.maegul.data.dao.impl.MediaItemDao#findByType(java.lang.String)
     */
    @SuppressWarnings("unchecked")
    public List<MediaItem> findByType(String type) {
        Query q = getEntityManager().createQuery("select u from " + getClazz() + " where u.type = :type");
        q.setParameter("type", type);

        return q.getResultList();
    }
}

EDIT 3

This is the AbstractDAO class: http://pastebin.com/f2BQG9RE

And this is the DAO interface, which is implemented by AbstractDAO: http://pastebin.com/h7dAHTTC

and this is the Interface MEdiaItemDao:

import java.util.List;

import com.maegul.data.dao.DAO;
import com.maegul.data.entities.MediaItem;

public interface MediaItemDao extends DAO<MediaItem>{

    MediaItem findByName(String name);

    List<MediaItem> findByType(String type);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

捎一片雪花 2024-12-20 17:15:20

它只需要一个干净的项目,所以我这样做了并且修复了它。

It only needed a project clean, so I did and it fixed it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文