web-dev-qa-db-fra.com

Le champ autowire n'a pas pu être utilisé au printemps. Pourquoi?

Je continue à avoir cette erreur, et je ne peux pas comprendre pourquoi .. oui je sais que beaucoup de gens ont eu des problèmes similaires, mais lire les réponses qu’ils ont obtenues ne résout pas mon problème.

org.springframework.beans.factory.BeanCreationException: erreur lors de la création d'un bean avec le nom 'contactController': l'injection des dépendances autowired a échoué; L'exception imbriquée est org.springframework.beans.factory.BeanCreationException: impossible pour le champ autowire: private net.service.ContactService net.controller.ContactController.contactService; L'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean correspondant du type [net.service.ContactService] trouvé pour la dépendance: attendu au moins 1 bean pouvant être considéré comme candidat autowire pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

voici le contrôleur:

@Controller
@SessionAttributes
public class ContactController {

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


}

the 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 ContactDaoImpl

@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();
    }

}

et le spring-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>
25
Sanyifejű

Au printemps, servlet .xml:

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

(J'ai supposé que le service impl est dans le même package que l'interface de service "net.service")

Je pense que vous devez ajouter le package net.service (ou la totalité de net) à l'analyse des composants. Actuellement, spring ne recherche que des composants dans net.controller et, dans la mesure où votre implément service est dans net.service, il ne sera pas instancié au printemps.

34
Pyranja

Il y a bien un problème avec la création du bean ContactServiceImpl. Tout d'abord, assurez-vous que la classe est réellement instanciée en déboguant le constructeur no-args lorsque le contexte Spring est initié et lorsqu'une instance de ContactController est créée.

Si la variable ContactServiceImpl est réellement instanciée par le contexte Spring, mais qu'elle ne correspond tout simplement pas à votre annotation @Autowire, essayez d'être plus explicite dans votre injection d'annotation. Voici un gars qui a un problème similaire au vôtre et qui donne quelques solutions possibles:

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

Si vous me demandez, je pense que ça ira si vous remplacez 

@Autowired
private ContactService contactService;

avec:

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

J'avais cette même erreur et la chercher m'a amené ici. Mon correctif semblait être simplement d'ajouter l'annotation @Component à l'implémentation du service abstrait.

Dans ce cas, cela ressemblerait à:

import org.springframework.stereotype.Component;

...

@Component
public class ContactServiceImpl implements ContactService {
9
DKLEO

Lorsque vous obtenez cette erreur, il manque une annotation . Il me manquait l'annotation @service on service Lorsque j'ai ajouté cette annotation, cela a bien fonctionné pour moi.

5
bond

J'ai fait face au même problème aujourd'hui. En fait, j’ai oublié de mentionner les annotations @ Service/@ Component pour mon fichier d’implémentation de service, pour lequel spring n’est pas capable d’autowire et n’a pas pu créer le bean. 

1
Siddhartha Thota

J'ai eu exactement le même problème, essayez de mettre les deux classes dans le même paquet et ajoutez une ligne dans le fichier pom.xml 

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

Dans la configuration Java, assurez-vous d’avoir importé votre configuration dans RootConfig comme ceci @Import (PersistenceJPAConfig.class)

0
laudukang