2013-12-05 4 views
1

Java-Based ConfigurationJava Bean @Autowired ошибка

package com.mgroup.init; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Scope; 

import com.mgorup.dao.EmployeeDao; 
import com.mgroup.controller.EmployeeController; 
import com.mgroup.services.EmployeeService; 

@Configuration 
public class MyConfig { 

    @Bean 
    @Scope("prototype") 
    public EmployeeService employeeServiceBean() 
    { 
     //constructor injection on a class StoreService. well it was, nto it is autowire 
     return new EmployeeService();//(storeDaoBean()); 
    } 

    @Bean 
    @Scope("prototype") 
    public EmployeeDao employeeDaoBean() 
    { 
     return new EmployeeDao(); 
    } 


} 

класс контроллера

package com.mgroup.controller; 

import javax.annotation.Resource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

import com.mgroup.pojo.Patron; 
import com.mgroup.services.EmployeeService; 

@Controller 
public class EmployeeController { 

    @Autowired 
    EmployeeService employeeServiceBean; 


    /* Loading Home Page */ 
    @RequestMapping("/Login.html") 
    public String loadLoginPage() { 
     return "Welcome"; 
    } 

} 

Код ошибки

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fdmgroup.services.EmployeeService com.fdmgroup.controller.EmployeeController.employeeServiceBean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.fdmgroup.services.EmployeeService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 

У меня также есть EmployeeService и EmployeeDao. Они отлично справляются с автоподготовкой. I.e См. Ниже. Проблема, с которой я сталкиваюсь, когда пытаюсь ввести EmployeeService с аннотацией autwire в классе Controller, я получаю ошибку выше. Это связано с тем, что у меня есть класс конфигурации Java и класс конфигурации xml, который имеет компонентный сканер?

@Service 
public class EmployeeService implements EmployeeServicesInterface{ 

    @Autowired 
    EmployeeDao employeeDaoBean; 
    @Override 

Это мой servlet.xml. Я удалил схемы в скобке, чтобы зарезервировать некоторое пространство.

<beans > 

    <!-- Scan the package containing annotations -->  
    <context:annotation-config /> 
    <context:component-scan base-package="com.mgroup.controller" /> 

    <!-- jspViewResolver bean – This bean defined view resolver for spring mvc. For this bean we also set prefix as “/WEB-INF/jsp/” 
    and suffix as “.jsp”. Thus spring automatically resolves the JSP from WEB-INF/jsp folder and assigned suffix .jsp to it. --> 
    <bean id="jspViewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

</beans> 

Вот web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>library</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 


</web-app> 
+0

Какой контекст загружается где? –

+0

Также есть 'com.fdmgroup.controller' опечатка? –

+0

Да, это опечатка, когда я копирую и вставляю его здесь. Я редактировал мой quesiton. –

ответ

0

Ваш EmployeeService находится вне диапазона сканирования пакета. Попытайтесь изменить base-package на "com.fdmgroup"

1

Вы настроили класс @Configuration, который настраивает компоненты или компоненты вашего приложения?

Вы можете попробовать это в своем файле web.xml, чтобы загрузить свой класс конфигурации.

<context-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
</context-param> 

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.mgroup.init</param-value> 
</context-param> 
+0

Исправьте меня, если я ошибаюсь. Я все еще изучаю Spring framework и Servlet. Насколько я понимаю ваше предложение, когда сервер запускается, он читает в web.xml и загружает классы, объявленные в правильно? –

+0

Да, это так. И из приведенной выше конфигурации ваши компоненты будут инициированы поиском классов под пакетом «com.mgroup.init». Аннотирование класса с помощью «@Configuration» означает, что класс может использоваться контейнером Spring IoC в качестве источника определений bean-компонентов. Аннотирование @Bean сообщает Spring, что метод, аннотированный с помощью «@Bean», вернет объект, который должен быть зарегистрирован как компонент в контексте приложения Spring. –

0

Убедитесь, что у вас есть EmployeeService в отсканированном пакете. Попробуйте изменить

<context:component-scan base-package="com.mgroup.controller" /> 

в

<context:component-scan base-package="com.mgroup" /> 
Смежные вопросы