2014-09-29 4 views
28

Sto provando a scrivere un servizio SOAP utilizzando Spring, tuttavia ricevo un problema di Dipendenza da Iniezione. Sto avendo problemi con @Autowired attraverso il servizio come questo:Non trovato per dipendenza: previsto almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. Annotazioni dipendenze:

public interface UserDao { 
    User getUser(String username); 
} 

Attuazione per Dao, come di seguito:

@Controller("userDao") 
    public class UserDaoImpl implements UserDao { 
    private static Log log = LogFactory.getLog(UserDaoImpl.class); 

    @Autowired 
    @Qualifier("sessionFactory") 
    private LocalSessionFactoryBean sessionFactory; 

    @Override 
    public User getUser(String username) { 
     Session session = sessionFactory.getObject().openSession(); 
     // Criteria query = session.createCriteria(Student.class); 
     Query query = session 
       .createQuery("from User where username = :username"); 
     query.setParameter("username", username); 
     try { 
      System.out.println("\n Load Student by ID query is running..."); 
      /* 
      * query.add(Restrictions.like("id", "%" + id + "%", 
      * MatchMode.ANYWHERE)); return (Student) query.list(); 
      */ 
      return (User) query.uniqueResult(); 
     } catch (Exception e) { 
      // TODO: handle exception 
      log.info(e.toString()); 
     } finally { 
      session.close(); 
     } 
     return null; 
    } 

} 

e

public interface UserBo { 
    User loadUser(String username); 
} 

e

public class UserBoImpl implements UserBo { 
    @Autowired 
    private UserDao userDao; 

    @Override 
    public User loadUser(String username) { 
     // TODO Auto-generated method stub 
     return userDao.getUser(username); 
    } 

} 


@WebService 
@Component 
public class UserService { 

    @Autowired 
    private UserBo userBo; 

    @WebMethod(operationName = "say") 
    public String sayHello(String name) { 
     return ("Hello Java to " + name); 
    } 

    @WebMethod(operationName = "getUser") 
    public User getUser(String username) { 
     return userBo.loadUser(username); 
    } 
} 

Il B elow è XML file di mapping

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core" 
    xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://jax-ws.dev.java.net/spring/core 
    http://jax-ws.java.net/spring/core.xsd 
    http://jax-ws.dev.java.net/spring/servlet 
    http://jax-ws.java.net/spring/servlet.xsd 

    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 
    <context:annotation-config /> 

    <context:component-scan base-package="edu.java.spring.ws"></context:component-scan> 
    <context:component-scan base-package="edu.java.spring.ws.dao"></context:component-scan> 
    <bean id="userDao" class="edu.java.spring.ws.dao.UserDaoImpl"></bean> 
    <!-- <context:component-scan base-package="edu.java.spring.ws.bo"></context:component-scan> 
    --> 
    <wss:binding url="/user"> 
     <wss:service> 
      <ws:service bean="#userService" /> 
     </wss:service> 
    </wss:binding> 
    <bean id="userBo" class="edu.java.spring.ws.bo.impl.UserBoImpl"></bean> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/contentdb" /> 
     <property name="username" value="root" /> 
     <property name="password" value="123456" /> 
    </bean> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
     <property name="packagesToScan" value="edu.java.spring.ws.model" /> 
    </bean> 
</beans> 

e l'errore gettato durante la distribuzione è: Ecco la traccia dello stack aggiornamento:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.sun.xml.ws.transport.http.servlet.SpringBinding#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot create inner bean '(inner bean)#538071ba' of type [org.jvnet.jax_ws_commons.spring.SpringService] while setting bean property 'service'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#538071ba' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'userService' while setting bean property 'bean'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.bo.UserBo edu.java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:290) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) 
    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: Error creating bean with name '(inner bean)#538071ba' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'userService' while setting bean property 'bean'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.bo.UserBo edu.java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    ... 24 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.bo.UserBo edu.java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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:292) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) 
    ... 30 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.bo.UserBo edu.java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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:508) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    ... 38 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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:292) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    ... 40 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.java.spring.ws.dao.UserDao edu.java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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:508) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    ... 51 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.java.spring.ws.dao.UserDao] 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:1103) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    ... 53 more 
+1

Puoi aggiungere l'implementazione della tua classe 'UserDao'? È annotato come 'Reporitory'? – Jens

+0

Mi dispiace, ho perso l'implementazione per Dao. Ho aggiornato come sopra. – user2659694

+1

Aggiungi l'annotazione del repository come richiesto da @Jens. Inoltre, inserisci una voce nel file di mappatura. – Nilesh

risposta

2

È sembra mancare implementazione per l'interfaccia UserDao. Se si guarda da vicino l'eccezione che dice

No fagioli qualifica di tipo [edu.java.spring.ws.dao.UserDao] trovato per dipendenza:

Il modo in cui funziona è @Autowired che cercherebbe automaticamente l'implementazione di una dipendenza che si inietta tramite un'interfaccia. In questo caso, poiché non esiste un'implementazione valida dell'interfaccia, UserDao ottiene l'errore. Assicurati di avere un'attuazione valida per questa classe e il tuo errore dovrebbe andare.

Spero che questo aiuti.

+0

No, ho implementato, aggiorno come sopra – user2659694

9

Aggiungere l'annotazione @Repository alla realizzazione di UserDaoImpl

@Repository 
public class UserDaoImpl implements UserDao { 
    private static Log log = LogFactory.getLog(UserDaoImpl.class); 

    @Autowired 
    @Qualifier("sessionFactory") 
    private LocalSessionFactoryBean sessionFactory; 

    //... 

} 
+0

Ho provato come suggerimento ma non è buono. Il registro di traccia come di seguito Errore nella creazione di bean con nome 'userDaoImpl': Iniezione delle dipendenze autowired fallita; eccezione nidificata isorg.springframework.beans.factory.BeanCreationException: non è possibile eseguire il campo autowire: private org.springframework.orm.hibernate4.LocalSessionFactoryBean edu.java.spring.ws.dao.impl.UserDaoImpl.sessionFactory; l'eccezione annidata è org.springframework.beans.factory.CannotLoadBeanClassException: Impossibile trovare la classe [edu.java.spring.ws.dao.UserDaoImpl] per bean con nome 'userDao' – user2659694

+0

@ user2659694 guardare [qui] (http: // docs. spring.io/spring/docs/3.0.x/spring-framework-reference/html/orm.html) forse questo aiuta. – Jens

29

Guardate eccezione:

No qualifying bean of type [edu.java.spring.ws.dao.UserDao] found for dependency 

Questo significa che non c'è di fagioli disponibili per soddisfare tale dipendenza. Sì, hai un'implementazione dell'interfaccia, ma non hai creato un bean per quella implementazione. Sono disponibili due opzioni:

  • Annota UserDaoImpl con @Component o @Repository, e lasciare che la scansione componente fare il lavoro per voi, esattamente come avete fatto con UserService.
  • Aggiungi il bean manualmente al tuo file xml, lo stesso che hai fatto con UserBoImpl.

Ricordare che se si crea il bean esplicitamente è necessario inserire la definizione prima della scansione del componente. In questo caso l'ordine è importante.

+0

Ho davvero creato un bean nel file xml. Si prega di verificare di nuovo per aiutarmi. Grazie – user2659694

+1

Se si aggiunge esplicitamente la definizione del bean nel file xml, questa deve essere posizionata prima della scansione del componente che crea il bean dipendente. Migliorerò la risposta. – diegomtassis

+0

Grazie mille! Quella spiegazione dettagliata ha funzionato come un fascino. – JavaDragon

0

ho mancato di aggiungere

@Controller("userBo") into UserBoImpl class. 

La soluzione per questo è l'aggiunta di questo controller nella classe Impl.

+5

Non sono d'accordo con quella risposta! Si prega di rivisitare e vedere ciò che tutte le cose che hai aggiunto. – Nilesh

+0

Aspettami, controlla di nuovo. – user2659694

+1

Il tuo BO non è un controller! – Jens

0

Aggiungi annotazione repository prima della classe di implementazione DAO. esempio:

@Repository 
public class EmpDAOImpl extends BaseNamedParameterJdbcDaoSupportUAM 
implements EmpDAO{ 
} 
0

ho aggiunto @Service prima della lezione impl e l'errore è scomparso.

@Service 
public class FCSPAnalysisImpl implements FCSPAnalysis 
{} 
1

Abbiamo affrontare questo problema, ma aveva ragione diversa, qui è il motivo:

Nel nostro progetto trovato l'ingresso di fagioli multiple con lo stesso nome di fagioli. 1 in applicationContext.xml & 1 in dispatcherServlet.xml

Esempio:

<bean name="dataService" class="com.app.DataServiceImpl"> 
<bean name="dataService" class="com.app.DataServiceController"> 

& stiamo cercando di autowired per nome Dataservice.

Soluzione: abbiamo cambiato il nome di fagioli & suo risolto.

Problemi correlati