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>
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.
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{
}
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")
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.
@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 ...
Vous avez oublié l'annotation @Service dans votre classe de service.
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{
}
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.