2015-01-02 214 views
0

我想使用spring依賴注入在我的web應用程序中注入一些對象。Spring中的依賴注入失敗

在EtudiantServiceImpl類(其中有@Service註釋),我有:

@Autowired 
private IEtudiantDao etudiantDao; 

而且在EtudiantAction類(其中有@Service註釋),我有:

@Autowired 
private EtudiantServiceImpl etudiantService; 
@Autowired 
public Etudiant etudiant; 

但是當我運行我的應用程序得到這個錯誤信息:

2015-01-02 06:14:38,741 ERROR (org.apache.struts2.dispatcher.Dispatcher:38) - Exception occurred during processing request: Unable to instantiate Action, tp.ihm.gestionEtudiants.web.EtudiantAction, defined for 'etudiants' in namespace '/'Error creating bean with name 'tp.ihm.gestionEtudiants.web.EtudiantAction': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private tp.ihm.gestionEtudiants.service.EtudiantServiceImpl tp.ihm.gestionEtudiants.web.EtudiantAction.etudiantService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [tp.ihm.gestionEtudiants.service.EtudiantServiceImpl] 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)} 
Unable to instantiate Action, tp.ihm.gestionEtudiants.web.EtudiantAction, defined for 'etudiants' in namespace '/'Error creating bean with name 'tp.ihm.gestionEtudiants.web.EtudiantAction': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private tp.ihm.gestionEtudiants.service.EtudiantServiceImpl tp.ihm.gestionEtudiants.web.EtudiantAction.etudiantService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [tp.ihm.gestionEtudiants.service.EtudiantServiceImpl] 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 com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:316) 
    at com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397) 
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194) 
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63) 
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37) 
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:552) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tp.ihm.gestionEtudiants.web.EtudiantAction': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private tp.ihm.gestionEtudiants.service.EtudiantServiceImpl tp.ihm.gestionEtudiants.web.EtudiantAction.etudiantService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [tp.ihm.gestionEtudiants.service.EtudiantServiceImpl] 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.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1073) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:373) 
    at com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:203) 
    at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:183) 
    at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:154) 
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:171) 
    at com.opensymphony.xwork2.factory.DefaultActionFactory.buildAction(DefaultActionFactory.java:22) 
    at com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:141) 
    at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297) 
    ... 27 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private tp.ihm.gestionEtudiants.service.EtudiantServiceImpl tp.ihm.gestionEtudiants.web.EtudiantAction.etudiantService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [tp.ihm.gestionEtudiants.service.EtudiantServiceImpl] 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.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 36 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [tp.ihm.gestionEtudiants.service.EtudiantServiceImpl] 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:924) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    ... 38 more 

這是應用程序上下文文件:

<!-- Configure jdbc.properties --> 
    <bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/jdbc.properties" /> 

    <!-- Data Source configuration --> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

     <property name="driverClassName"> 
      <value>${jdbc.driverClassName}</value> 
     </property> 
     <property name="url"> 
      <value>${jdbc.databaseurl}</value> 
     </property> 
     <property name="username"> 
      <value>${jdbc.username}</value> 
     </property> 
     <property name="password"> 
      <value>${jdbc.password}</value> 
     </property> 
    </bean> 

    <!-- Configure hibernate session factory -->  
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="configurationClass">    
      <value>org.hibernate.cfg.AnnotationConfiguration</value>   
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 
    <!-- Run SQL queries in transactions --> 
    <tx:annotation-driven /> 
    <context:annotation-config></context:annotation-config> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

</beans> 

EDIT1:

後,我加入這行到我的Spring配置文件:

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

它解決了這個問題,但現在我越來越另一個錯誤信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericDaoImpl' defined in file [C:\Users\Aimad\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\TP_WEB_GestionEtudiants\WEB-INF\classes\tp\generic\dao\GenericDaoImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1422) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4772) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118) 
    at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1479) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1419) 
    ... 21 more 

而這是GenericDaoImpl類:

@Repository 
public class GenericDaoImpl<T, PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T,PK> { 

    private Class<T> entityClass; 

    public GenericDaoImpl(){ 
    } 

    public GenericDaoImpl(final Class<T> entityClass){ 
     this.entityClass = entityClass; 
    } 

    public T getEntity(PK id) { 
     return (T) getHibernateTemplate().get(entityClass, id); 
    } 

    public List<T> getAll(){ 
     return getHibernateTemplate().loadAll(entityClass); 
    } 

    public PK save(T entity) { 
     return (PK) getHibernateTemplate().save(entity); 
    } 

    public void delete(PK id) { 
     if(getEntity(id) != null) 
      getHibernateTemplate().delete(getEntity(id)); 
    } 

    public void update(T entity) { 
     getHibernateTemplate().update(entity); 

    } 
+1

消息很明確:您沒有要注入的bean。如果您使用'@ Service'並且主要使用XML配置,則需要激活註釋處理和組件掃描。 – chrylis

+0

你如何配置你的bean?春天如何尋找它? – Braj

回答

-1

不確定,但你是否使用getter和setter作爲私有字段,有時會在你沒有getter和setter的情況下拋出這種錯誤。

3

你必須提及自動掃描所有的豆。

請註明以下配置在Spring XML配置文件:

<context:component-scan base-package="com.x.y.z" /> 

Tutorial

Here被編程爲自動掃描配置。

+0

請參閱我對我的帖子所做的修改 –