我无法在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
答案 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>