@Autowired - нет подходящего компонента типа, найденного для зависимости, по меньшей мере, одного компонента
В настоящее время я столкнулся с проблемой в конфигурации Autowire между контроллером и уровнем обслуживания.
Я не могу проследить свои ошибки.
Простая информация о журнале
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: {}
Ниже я также дал код контроллера и уровня обслуживания, а также диспетчер-servlet.xml
контроллер
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;
}
}
Интерфейс службы
package com.ott.service;
import com.ott.hibernate.Employee;
import java.util.List;
/**
*
* @author SPAR
*/
public interface EmployeeService {
List<Employee> fetchAll();
}
Интерфейс сервиса 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;
}
}
Диспетчер-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>
Ответы
Ответ 1
Вам не обязательно обязательно указывать имя и квалификатор. Если вы установили имя, то имя, с которым этот компонент зарегистрирован в контексте. Если вы не укажете имя для своей услуги, оно будет зарегистрировано как некапитализированное неквалифицированное имя класса на основе BeanNameGenerator
. Поэтому в вашем случае Реализация будет зарегистрирована как employeeServiceImpl
. Поэтому, если вы попытаетесь выполнить аутсорение с этим именем, оно должно быть разрешено напрямую.
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
используется в случае, если существует более одного компонента одного и того же типа, и вы хотите автоувеличивать различные компоненты реализации для различных целей.
Ответ 2
Ребята, я нашел проблему
Я просто попробовал, добавив имя квалификатора в службу сотрудников, наконец, решил мою проблему.
@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService{
}
Ответ 3
Я считаю, что для @Service
вам нужно добавить имя квалификатора, как @Service
ниже:
@Service("employeeService")
должен решить вашу проблему
или после @Service
вы должны добавить @Qualifier
@Qualifier, как показано ниже:
@Service
@Qualifier("employeeService")
Ответ 4
@Service: он сообщает, что конкретный класс является Сервисом для клиента. Класс обслуживания содержит в основном бизнес-логику. Если у вас больше классов обслуживания в пакете, чем предоставление @Qualifier, в противном случае он не должен требовать @Qualifier.
Дело 1:
@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService{
}
Вариант 2:
@Service
public class EmployeeServiceImpl implements EmployeeService{
}
оба дела работают...
Ответ 5
Если у вас только один компонент типа EmployeeService, а интерфейс EmployeeService не имеет других реализаций, вы можете просто поставить "@Service" перед EmployeeServiceImpl и "@Autowire" до метода setter. В противном случае вы должны указать специальный bean-компонент, например @Service ("myspecial"), и поставить "@autowire @Qualifier (" myspecial ") перед методом setter.
Ответ 6
В классе контроллера просто добавьте аннотацию @ComponentScan ("package"). В моем случае имя пакета com.shoppingcart.So я написал код как @ComponentScan ("com.shoppingcart"), и это сработало для меня.
Ответ 7
Вы забыли аннотацию @Service в своем классе обслуживания.
Ответ 8
Просто добавьте ниже аннотацию с именем квалификатора сервиса в сервисе Класс реализации:
@Service("employeeService")
@Transactional
public class EmployeeServiceImpl implements EmployeeService{
}
Ответ 9
Также может возникнуть проблема с отсутствием ключевого слова "реализует" в классах impl