Controller中的Spring Autowire无法正常工作

时间:2015-02-27 18:12:24

标签: java spring rest autowired

我无法在Spring REST Controller中使用@Autowired注释。 (当我删除其@Autowired依赖项时,控制器本身也可以工作。)

我在Windows Tomcat v7下使用java运行时和编译时编译器版本1.6运行它。

网址为:

http://localhost:8080/bill-web/rest/article/get/chapterName/sdfsa/searchQueryInput/sadfsfa

错误是:

          org.springframework.beans.factory.BeanCreationException: 
        Error creating bean with name 'articleController': 
        Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
        Could not autowire field: 
    private org.ieee.bill.services.ArticleService org.ieee.bill.web.controller.ArticleController.articleService; 

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
        No qualifying bean of type [org.ieee.bill.services.ArticleService] 
        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)}

WEB-INF / web.xml中:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">

    <display-name>bill-web</display-name>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.xml</param-value>
    </context-param>

    <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

WEB-INF / servlet的context.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans >
 <!-- removing namespaces -->
    <beans:bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </beans:bean>
    <beans:bean id="jacksonMessageConverter"  
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
    </beans:bean>

    <beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jacksonMessageConverter" />
            </beans:list>
        </beans:property>
    </beans:bean>   

    <mvc:annotation-driven />

    <context:spring-configured />
    <context:component-scan base-package="org.ieee.bill.web.controller" />
</beans:beans>

WEB-INF /弹簧/应用-config.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- removing namespaces -->

    <context:spring-configured/>
    <context:component-scan base-package="org.ieee.bill.services"/>
</beans>

ArticleController(REST控制器):

package org.ieee.bill.web.controller;

// removed imports for brevity

@Controller
@RequestMapping(value = "/article")
public class ArticleController {

    static Logger log = Logger.getLogger(ArticleController.class.getName());

    @Autowired
    @Qualifier("articleService")
    private ArticleService articleService;

    @RequestMapping(
            value = "/get/chapterName/{chapterName}/searchQueryInput/{searchQueryInput}",
            method = RequestMethod.GET, 
            headers = "Accept=application/json")
    public @ResponseBody Collection<Article> getArticles(
        @PathVariable final String chapterName, 
        @PathVariable final String searchQueryInput,
        final HttpServletRequest request,
        final HttpServletResponse response
    )
    throws Exception 
    {
        // some controller logic here
    }
}

ArticleService.java:

  package org.ieee.bill.services;

   // removed imports for brevity

    @Service("articleService")
    public class ArticleServiceImpl implements ArticleService {

        @Override
        public List<Article> getArticles(String chapterName, String searchQuery)
        {
            // some service logic here
        }
    }

更多追踪:

'org.springframework.context.config.internalBeanConfigurerAspect'
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton()220 Creating shared instance of singleton bean 'articleController'
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.beans.factory.support.DefaultListableBeanFactory.createBean()450 Creating instance of bean 'articleController'
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.beans.factory.annotation.InjectionMetadata.checkConfigMembers()71 Registered injected element on class [org.ieee.bill.web.controller.ArticleController]: AutowiredFieldElement for private org.ieee.bill.services.ArticleService org.ieee.bill.web.controller.ArticleController.articleService
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.beans.factory.support.DefaultListableBeanFactory.doCreateBean()524 Eagerly caching bean 'articleController' to allow for resolving potential circular references
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.beans.factory.annotation.InjectionMetadata.inject()85 Processing injected method of bean 'articleController': AutowiredFieldElement for private org.ieee.bill.services.ArticleService org.ieee.bill.web.controller.ArticleController.articleService
    02/27/2015 13:32:50  [http-bio-8080-exec-2]:springframework.web.context.support.XmlWebApplicationContext.refresh()489 Exception encountered during context initialization - cancelling refresh attempt
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.ieee.bill.services.ArticleService org.ieee.bill.web.controller.ArticleController.articleService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.ieee.bill.services.ArticleService] 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.Qualifier(value=articleService)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:763)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:664)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
        at javax.servlet.GenericServlet.init(GenericServlet.java:159)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:951)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:909)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:662)
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.ieee.bill.services.ArticleService org.ieee.bill.web.controller.ArticleController.articleService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.ieee.bill.services.ArticleService] 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.Qualifier(value=articleService)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1205)
        ... 34 more
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.ieee.bill.services.ArticleService] 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.Qualifier(value=articleService)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1261)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1009)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527)
        ... 37 more

1 个答案:

答案 0 :(得分:1)

当您的文件位于contextConfigLocation时,您的WEB-INF/spring/application-config.xml值需要更新,因此请更改

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/application-config.xml</param-value>
    </context-param>