2015-02-16 2 views
7

В настоящее время я столкнулся с проблемой в конфигурации Autowire между контроллером и уровнем обслуживания.@Autowired - не имеет определяющего компонента типа, найденного для зависимости, по крайней мере, одного компонента

Я не могу отслеживать свои ошибки.

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: {} 

Ниже я также дал код контроллера и Service Layer, а также диспетчеру-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(); 


} 

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; 
    } 
} 

грузоотправитель-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> 
+0

Вы можете добавить @Service ("e mployeeService ") –

ответ

4

Вам необязательно обязательно указывать имя и квалификатор. Если вы задаете имя, это имя, с которым бит был зарегистрирован в контексте. Если вы не укажете имя своей службы, оно будет зарегистрировано как некапитализированное неквалифицированное имя класса на основе 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 используются в том случае, если есть более чем один боб существует одного типа, и вы хотите autowire различных бобов реализации для различных целей.

3

Я считаю, что для @Service вы должны добавить квалификатор имя, как показано ниже:

@Service("employeeService") должен решить ваш вопрос

или после @Service вы должны добавить @Qualifier annontion, как показано ниже:

@Service 
@Qualifier("employeeService") 
+0

Спасибо Рамешу, просто прочитайте эту документацию весной http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-scanning- автообнаружение и, наконец, решить проблему – Arun

+0

Ramesh @Service не всегда должно иметь имя и квалификатор. Прочтите мой ответ для ясности. Я не хочу, чтобы ваш ответ был ошибочным. – minion

+0

@minion, вы правы, согласно OP требуется –

5

Ребята я нашел вопрос

Я просто попытался добавить имя отборочные в службе сотрудников, наконец, решил мою проблему.

@Service("employeeService") 

public class EmployeeServiceImpl implements EmployeeService{ 

} 
+0

Вот что сказал @Ramesh Kotha. –

0

Если у вас только один компонент типа EmployeeService, а в интерфейсе EmployeeService нет других реализаций, вы можете просто поставить «@Service» перед EmployeeServiceImpl и «@Autowire» до метода setter. В противном случае вы должны назвать специальный bean-компонент как @Service («myspecial») и поставить «@autowire @Qualifier» («myspecial») перед методом setter.

0

В классе контроллера просто добавьте пакет @ComponentScan ("package "). В моем случае имя пакета - com.shoppingcart.Поэтому я написал код как @ComponentScan («com.shoppingcart»), и это сработало для меня.

0

Вы забыли аннотацию @Service в своем классе обслуживания.

0

@ Сервис: он сообщает, что конкретный класс является Сервисом для клиента. Класс обслуживания содержит в основном бизнес-логику. Если у вас больше классов обслуживания в пакете, чем предоставление @Qualifier, в противном случае он не должен требовать @Qualifier.

Случай 1:

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

Вариант 2:

@Service 
public class EmployeeServiceImpl implements EmployeeService{ 
} 

оба случай работает ...

0

Просто добавьте ниже аннотаций с именем квалификационной службы в классе реализации услуг:

@Service("employeeService") 
@Transactional 
public class EmployeeServiceImpl implements EmployeeService{ 
} 
Смежные вопросы

 Смежные вопросы