java - springMVC 怎么在方法中注入HttpServletResponse对象

查看:892
本文介绍了java - springMVC 怎么在方法中注入HttpServletResponse对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我在springmvc中使用@Autowired注解可以注入HttpServletRequest对象,但是在注入HttpServletResponse之后却报错,启动直接报错

附代码如下

    @Autowired
    public HttpServletRequest request;
    
    @Autowired
    public HttpServletResponse response;

我知道可以直接在方法中把request和response当做参数传递进去的,但是我只是想知道这样为什么不行,另外想请大神们指导一下应该用哪种方法?

报错下线如下:

严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'neucloudOauth2Controller': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public javax.servlet.http.HttpServletResponse com.isv.spi.controllers.NeucloudOauth2Controller.response; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.http.HttpServletResponse] 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)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1279)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1192)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public javax.servlet.http.HttpServletResponse com.isv.spi.controllers.NeucloudOauth2Controller.response; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.http.HttpServletResponse] 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)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)
    ... 28 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.http.HttpServletResponse] 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)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 30 more

2016-12-01 补充问题

    @Autowired
    private DzyOauthService service;
    
    @Autowired
    private HttpServletRequest request;

DzyOauthController类需要注入上面2个参数,下面是项目启动,注入的过程日志。

2016-12-01 13:37:09,582 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Creating shared instance of singleton bean 'dzyOauthController'
2016-12-01 13:37:09,582 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Creating instance of bean 'dzyOauthController'
2016-12-01 13:37:09,583 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Registered injected element on class [com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController]: AutowiredFieldElement for private com.ucfgroup.framework.httpIntf.neucloud.dzy.service.DzyOauthService com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController.service
2016-12-01 13:37:09,583 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Registered injected element on class [com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController]: AutowiredFieldElement for private javax.servlet.http.HttpServletRequest com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController.request


2016-12-01 13:37:09,583 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Eagerly caching bean 'dzyOauthController' to allow for resolving potential circular references


2016-12-01 13:37:09,583 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'dzyOauthController': AutowiredFieldElement for private com.ucfgroup.framework.httpIntf.neucloud.dzy.service.DzyOauthService com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController.service
2016-12-01 13:37:09,584 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'dzyOauthService'
2016-12-01 13:37:09,584 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'dzyOauthController' to bean named 'dzyOauthService'


2016-12-01 13:37:09,584 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'dzyOauthController': AutowiredFieldElement for private javax.servlet.http.HttpServletRequest com.ucfgroup.framework.httpIntf.neucloud.dzy.controller.DzyOauthController.request
2016-12-01 13:37:09,585 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'dzyOauthController' to bean named 'com.sun.proxy.$Proxy19@14e97bf6'

2016-12-01 13:37:09,585 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Finished creating instance of bean 'dzyOauthController'

可以看出,SpringMVC为了创建以及缓存 dzyOauthController 对象,先注入了一个属性dzyOauthService,这个是正常的私有属性的注入

同时在注入HttpServletRequest的时候,注入的内容是一个代理

Autowiring by type from bean name 'dzyOauthController' to bean named 'com.sun.proxy.$Proxy19@14e97bf6'

解决方案

因为Request 和 Response 都是针对一次请求的

如果你只用@Autowire 或者 @Resource 注解,依赖都是在应用启动时注入的,当你应用启动的时候请求还没来呢,哪儿来的 Request和Response对象啊。
所以当你需要Request 和Response对象时,需要将其放到controller的方法的参数中,这样每次请求时,Spring MVC框架就会自动将HttpServeletRequest 或 HttpServeletResponse对象注入。

PS:Request对象表示一次请求,里面包含了本次请求的所有信息,包括Http Header和 Body,
Response对象表示对请求的响应,可以设置响应的header和body

==================================
修改
在Spring MVC中,bean的scope有singleton, prototype, request, session等级别
request级别表示每次http请求时都会创建新的对象,在spring mvc中,如果依赖了HttpServletRequest 和 HttpServletResponse对象,就会在每次请求时重新计算依赖,创建新示例

如下图所示,request和response都能取到,而且每次请求时都会创建新的实例

这篇关于java - springMVC 怎么在方法中注入HttpServletResponse对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆