@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