NoSuchBeanDefinitionException如何初始化SessionFactory bean?

我有个问题。 我尝试使用Spring和Hibernate运行我的Web应用程序/我有一个奇怪的错误。 NoSuchBeanDefinitionException。 Stacktrace是:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:837) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 

我不知道为什么,因为在我的servlet-context.xml中我声明了SessionFacory bean:

                                com.example.entity.User com.example.entity.Role     hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true       

此外,我注释了所有DAO实现和服务实现。 有任何想法吗?

添加

这是我的代码的一部分:

 @Repository public class HibernateUserDAO implements UserDAO { @Autowired private SessionFactory sessionFactory; ... } 

和服务类:

 @Service public class UserServiceImpl implements UserService, UserDetailsService { @Autowired private UserDAO userDAO; @Override @Transactional public void create(User user) throws SQLException { userDAO.create(user); } 

完整的堆栈跟踪:

 Sep 20, 2013 10:54:10 AM org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateUserDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.example.dao.impl.hibernate.HibernateUserDAO.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1120) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.example.dao.impl.hibernate.HibernateUserDAO.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) ... 23 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:837) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) ... 25 more 

这是我的web.xml

  

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd“>

  contextConfigLocation  /WEB-INF/root-context.xml /WEB-INF/application-security.xml    org.springframework.web.context.ContextLoaderListener   dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/dispatcher-servlet.xml  1   dispatcher /   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*   hibernateFilter org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   hibernateFilter /*  

我将从清理配置开始

这个

  

包括所有这些

        

您正在使用组件扫描,因此无需显式定义所有bean(如果仍需要,则会使组件扫描变得毫无用处)。

接下来这两个豆子

   

已经暗示了

基本上离开你了

                    com.example.entity.User com.example.entity.Role     hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true       

并不是说它会解决您的问题,因为错误不是由于配置不完整,而是配置错误。 必须将datasourcesessionFactorytransactionManager移动到applicationContext.xml 。 Nex到那个你的applicationContext.xml还应该包含一个组件扫描,它扫描控制器之外的所有东西。

     

将servlet-context.xml中的更改为

    

这样可以防止重复实例化@Service@Repository bean。 现在正在发生的事情(您的ContextLoaderListenerDispatcherServlet正在加载和创建相同的bean,这会引导您到其他好的exception,并且在内存重复旁边,因为您在内存中有每个bean的2个实例)。

spring真正试图说的是:

 There are multiple bean definitions... 

我有这个问题:

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'metadataGeneratorFilter' is defined 

曾经我有像这样的xml文件:

     

如果您使用@Autowired,则无需在上下文中声明属性。 但它必须在上下文—> NoSuchBeanDefinition – >找不到它。

    

尝试从属性上下文中删除userDAO .–如果你自动连接它,你在上下文中不需要它。

但问题似乎是在这个bean:

  

不能注入sessionFactory的依赖,但一切似乎都是正确的:(你为什么不尝试删除会话工厂的@autowired,在hibernateUserDao的上下文中放置get / set一个add属性ref,只是为了测试会发生什么?