web-dev-qa-db-fra.com

@Autowired - Aucun bean qualifiant trouvé pour la dépendance d'au moins 1 bean

Actuellement, je suis confronté à un problème de configuration Autowire entre le contrôleur et la couche de service.

Je suis incapable de retracer mes erreurs.

Simple Log Info  

    SEVERE:   Exception while loading the app
    SEVERE:   Undeployment failed for context /OTT
    SEVERE:   Exception while loading the app : Java.lang.IllegalStateException: ContainerBase.addChild: start: org.Apache.catalina.LifecycleException: org.Apache.catalina.LifecycleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [com.ott.service.EmployeeService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Ci-dessous, j'ai également donné le code de la couche de contrôleur et de service ainsi que le dispatcher-servlet.xml

Manette

package com.ott.controller;

import com.ott.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

    /**
     *
     * @author SPAR
     */
    @Controller
    public class AdminController {

        private EmployeeService employeeService;

        @RequestMapping("/employee")
        public String employee(){
            this.employeeService.fetchAll();
            return "employee";
        }

        @Autowired(required = true)
        @Qualifier(value="employeeService")
        public void setEmployeeService(EmployeeService empService) {
            this.employeeService = empService;
        }

    }

Interface de service

package com.ott.service;

import com.ott.hibernate.Employee;
import Java.util.List;

/**
 *
 * @author SPAR
 */
public interface EmployeeService {

     List<Employee> fetchAll();


}

Service Interface Impl

package com.ott.service;

import com.ott.dao.EmployeeDAO;
import com.ott.hibernate.Employee;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author SPAR
 */
@Service
public class EmployeeServiceImpl implements EmployeeService{

    private EmployeeDAO employeeDAO;

    @Override
    @Transactional(readOnly = true)
    public List<Employee> fetchAll() {

        List<Employee> employees = employeeDAO.fetchAll();
        for (Employee employee : employees) {

            System.out.println("Name : "+employee.getFirst_Name() +" "+ employee.getLast_Name());

            System.out.println("Email Id : "+employee.getEmail_Id());
        }

        return employees;
    }

    @Autowired(required = true)
    @Qualifier(value="employeeDAO")
    public void setEmployeeDAO(EmployeeDAO empDAO) {
        this.employeeDAO = empDAO;
    }
}

Dispatcher-servlet.xml

 <?xml version='1.0' encoding='UTF-8' ?>
    <!-- was: <?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:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"       
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

        <context:component-scan base-package="com.ott.controller"/>
        <context:component-scan base-package="com.ott.hibernate"/>
        <context:component-scan base-package="com.ott.service"/>
        <context:component-scan base-package="com.ott.dao"/>

        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

        <mvc:resources mapping="/resources/**" location="/resources/" />

         <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
            <property name="definitions">
                <list>
                    <value>/WEB-INF/tiles-def/general-layout.xml</value>
                </list>
            </property>
        </bean>

        <bean id="viewResolverTiles" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
        </bean> 

        <mvc:annotation-driven />

        <bean
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="prefix">
            <value>/WEB-INF/pages/</value>
          </property>
          <property name="suffix">
            <value>.jsp</value>
          </property>
        </bean>
    </beans>
11
Arun

Vous n'êtes pas obligé de fournir votre nom et votre qualificatif. Si vous définissez un nom, il s'agit du nom sous lequel le bean est enregistré dans le contexte. Si vous ne fournissez pas un nom pour votre service, il sera enregistré en tant que nom de classe non qualifié non capitalisé basé sur BeanNameGenerator. Donc, dans votre cas, l'implémentation sera enregistrée en tant que employeeServiceImpl. Donc, si vous essayez de connecter automatiquement avec ce nom, le problème devrait être résolu directement.

private EmployeeService employeeServiceImpl;

@RequestMapping("/employee")
public String employee() {
    this.employeeService.fetchAll();
    return "employee";
}

@Autowired(required = true)
public void setEmployeeService(EmployeeService employeeServiceImpl) {
    this.employeeServiceImpl = employeeServiceImpl;
}

@Qualifier est utilisé dans le cas où il existe plusieurs beans du même type et que vous souhaitez autoriser différents beans d'implémentation à différentes fins. 

5
minion

Les gars j'ai trouvé le problème 

Je viens d'essayer en ajoutant le nom de qualification dans le service des employés, finalement, cela a résolu mon problème.

@Service("employeeService")

public class EmployeeServiceImpl implements EmployeeService{

}
8
Arun

Je crois que pour @Service vous devez ajouter un nom de qualificatif comme ci-dessous:

@Service("employeeService") devrait résoudre votre problème

ou après @Service, vous devriez ajouter @Qualifier annontion comme ci-dessous:

@Service
@Qualifier("employeeService")
5
Ramesh Kotha

Si vous n'avez qu'un seul bean de type EmployeeService et que l'interface EmployeeService n'a pas d'autres implémentations, vous pouvez simplement mettre "@Service" avant EmployeeServiceImpl et "@Autowire" avant la méthode setter . Sinon, vous devez nommer bean spécial comme @Service ("myspecial") et mettez "@autowire @Qualifier (" myspecial ") avant la méthode setter.

0
Mariuszy

@Service: Il indique que cette classe particulière est un service au client. La classe de service contient principalement la logique métier. Si vous avez plus de classes de services dans un package que de fournir @Qualifier, il ne devrait pas nécessiter de @Qualifier.

Cas 1: 

@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService{
}

Cas2:

@Service
public class EmployeeServiceImpl implements EmployeeService{
}

les deux cas fonctionnent ...

0
Narayan Yerrabachu

Vous avez oublié l'annotation @Service dans votre classe de service.

0
Resul Rzaeeff

Ajoutez simplement l'annotation ci-dessous avec le nom de qualificateur du service dans la classe d'implémentation du service:

@Service("employeeService")
@Transactional
public class EmployeeServiceImpl implements EmployeeService{
}
0
user7839057

Dans votre classe de contrôleur, ajoutez simplement l'annotation @ComponentScan ("package"). Dans mon cas, le nom du paquet est com.shoppingcart.So j'ai écrit le code sous la forme @ComponentScan ("com.shoppingcart") et cela a fonctionné pour moi.

0
kaustubh kamat