2012-08-14 10 views
25

Continuo a ricevere questo errore, e non riesco a capire perché .. sì, so che molte persone hanno avuto problemi simili, ma leggendo le risposte che hanno ottenuto, non risolve il mio problema.Impossibile eseguire il campo autowire in primavera. perché?

org.springframework.beans.factory.BeanCreationException: errore durante la creazione di bean con nome 'contactController': Iniezione di dipendenze autowired non riuscita; l'eccezione annidata è org.springframework.beans.factory.BeanCreationException: non è possibile eseguire il campo autowire: private net.service.ContactService net.controller.ContactController.contactService; l'eccezione annidata è org.springframework.beans.factory.NoSuchBeanDefinitionException: Nessun bean corrispondente di tipo [net.service.ContactService] trovato per dipendenza: atteso almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. annotazioni Dipendenza: {@ org.springframework.beans.factory.annotation.Autowired (richiesto = true)}

qui è il controller:

@Controller 
@SessionAttributes 
public class ContactController { 

    @Autowired 
    private ContactService contactService; 
//methods... 


} 

il ContactServiceImpl

@Service("contactService") 
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) 
public class ContactServiceImpl implements ContactService { 

    @Autowired 
    private ContactDao contactDao; 

    public ContactServiceImpl() { 
    } 

    @Override 
    @Transactional(propagation = Propagation.REQUIRED, readOnly = false) 
    public void addContact(Contact contact) { 
     contactDao.saveContact(contact); 
    } 

    @Override 
    public List<Contact> getContacts() { 
     return contactDao.getAllContacts(); 
    } 

} 

the ContactDaoplpl

@Repository("contactDao") 
public class ContactDaoImpl implements ContactDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public void saveContact(Contact contact) { 
     sessionFactory.getCurrentSession().saveOrUpdate(contact); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public List<Contact> getAllContacts() { 
     return (List<Contact>) sessionFactory.getCurrentSession().createQuery("from contact c").list(); 
    } 

} 

e la primavera-servlet.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" 
    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"> 

    <context:property-placeholder location="classpath:jdbc.properties" /> 
    <context:component-scan base-package="net.controller" /> 


    <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${database.driver}" /> 
     <property name="url" value="${database.url}" /> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>net.form.Contact</value> 
      </list> 
     </property> 


     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="hibernateTransactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
</beans> 
+0

così hai il metodo setter per il campo 'contactService'? – sundar

+0

@sundar non è necessario un metodo setter per quel campo in modo che l'iniezione a molla funzioni. Ad ogni modo, il problema qui è chiaramente il fatto che il bean da iniettare non è stato trovato fino a quanto sa Spring, non che sia stato trovato ma non è in grado di iniettarlo. –

+1

@DaveNewton: doh, hai ragione, ho scritto una lunga risposta di fantasia che non lo menziona affatto. Sì, se il pacchetto che contiene ContactServiceImpl non è tra quelli dichiarati come annotabili-scansionabili, il bean non verrà creato e quindi non sarà disponibile per l'iniezione in altri bean –

risposta

33

In primavera servlet .xml:

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

(ho pensato che le impl servizio è nello stesso pacchetto come il servizio di interfaccia "net.service")

Credo che bisogna aggiungere la net.service pacchetto (o tutti netti) per la scansione dei componenti . Attualmente la primavera ricerca solo in net.controller per i componenti e, poiché il servizio impl è in net.service, non verrà istanziato entro la primavera.

+0

sì, è stata una grande idea.

+0

Ho erroneamente tenuto il servizio in un altro pacchetto, ha funzionato benissimo. Grazie. –

8

Beh c'è un problema con la creazione del chicco ContactServiceImpl. Innanzitutto, assicurati che la classe sia effettivamente istanziata eseguendo il debug del costruttore no-args quando viene avviato il contesto Spring e quando viene creata un'istanza di ContactController.

Se il ContactServiceImpl è effettivamente istanziato dal contesto Spring, ma semplicemente non corrisponde alla tua annotazione @Autowire, prova ad essere più esplicito nell'iniezione di annotazioni. Ecco un ragazzo che fare con un problema simile come la tua e dando alcune possibili soluzioni:

http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

Se mi chiedete, penso che vi troverete bene se si sostituisce

@Autowired 
private ContactService contactService; 

con:

@Resource 
@Qualifier("contactService") 
private ContactService contactService; 
9

Stavo ricevendo lo stesso errore e la ricerca mi ha portato qui. La mia correzione sembrava essere semplicemente quella di aggiungere annotazioni @Component all'implementazione del servizio astratto.

In questo caso, che sarà simile:

import org.springframework.stereotype.Component; 

... 

@Component 
public class ContactServiceImpl implements ContactService { 
0

Ho avuto esattamente lo stesso problema cercano di mettere le due classi nello stesso package e aggiungere linea nella pom.xml

<dependency> 
      <groupId> org.springframework.boot </groupId> 
      <artifactId> spring-boot-starter-web </artifactId> 
      <version> 1.2.0.RELEASE </version> 
</dependency> 
5

Quando si riceve questo errore manca qualche annotazione. Mi mancava l'annotazione @service sul servizio. Quando ho aggiunto quell'annotazione, ha funzionato bene per me.

0

in Java di configurazione, assicurarsi di avere importare il config nella RootConfig come questo @import (PersistenceJPAConfig.class)

1

Ho affrontato lo stesso problema di oggi. Ho scoperto di essere dimenticato di menzionare @ Service/@ Component annotation per il mio file di implementazione del servizio, per il quale spring non è in grado di autowire e non riesce a creare il bean.

Problemi correlati