@Autowired - Kein qualifying-bean-Typ gefunden für die Abhängigkeit mindestens 1 Bohne
Zur Zeit stehe ich vor einem Problem in Autowire-Konfiguration zwischen controller und die service-Schicht.
Ich bin nicht in der Lage zu verfolgen, meine Fehler.
Einfache 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: {}
Unten habe ich auch die Controller-und Service-Ebene code und auch die dispatcher-servlet.xml
Controller
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;
}
}
Service-Schnittstelle
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>
- können Sie fügen Sie @Service("employeeService")
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du musst nicht unbedingt Namen und Qualifier. Wenn Sie einen Namen, das ist der name, mit dem die bean ist eingetragen im Kontext. Wenn Sie nicht geben Sie einen Namen für Ihren Dienst, wird es registriert als " kleingeschriebene nicht-qualifizierten Klassen-Namen basierend auf
BeanNameGenerator
. Also in deinem Fall die Umsetzung wird eingetragen, wieemployeeServiceImpl
. Also, wenn Sie versuchen, autowire mit diesem Namen, sollte es direkt beheben.@Qualifier
verwendet wird, im Falle dass, wenn es mehr als eine bean existiert der gleiche Typ und Sie wollen autowire unterschiedliche Umsetzung der Bohnen für verschiedene Zwecke.Jungs ich fand das Thema
Habe ich gerade versucht, durch das hinzufügen des qualifier-namens in der Mitarbeiter-service-schließlich ist es mein Problem gelöst.
Ich glaube, für
@Service
Sie hinzufügen, qualifier name wie unten :@Service("employeeService")
sollte das Problem behoben,oder nach
@Service
sollten Sie@Qualifier
annontion wie unten :Wenn Sie nur eine bean des Typs EmployeeService, und die Schnittstelle EmployeeService keine anderen Implementierungen können Sie einfach gesagt "@Service", bevor die EmployeeServiceImpl und "@Autowire" vor der setter-Methode.
Ansonsten sollte man sich den Namen der speziellen Bohne wie @Service("myspecial"), und stellen Sie "@autowire @Qualifier("myspecial"), bevor der setter-Methode.
In deiner controller-Klasse, einfach hinzufügen @ComponentScan("Paket") - annotation. In meinem Fall ist der Paketname com.Warenkorb.Also schrieb ich den code wie @ComponentScan("com.Warenkorb") und es funktionierte für mich.
Haben Sie vergessen, die @Service-annotation in Ihrem service-Klasse.
@Service: Sie besagt, dass die jeweilige Klasse ist eine Dienstleistung für den Kunden. Die Service-Klasse enthält vor allem business-Logik. Wenn Sie weitere Service-Klassen in einem Paket als @Qualifier ansonsten sollte er nicht verlangen, @Qualifier.
Fall 1:
Case2:
beiden Fällen arbeiten...
Fügen Sie einfach folgende annotation mit qualifier name service in der service-Implementierungsklasse:
Fehlt die 'implementiert' Schlüsselwort in den impl-Klassen könnte auch das Problem sein