@Autowired HttpServletResponse

21
我正在寻找一种自动装配HttpServletResponse的方法。它在Spring中不起作用,但我已经找到了这个描述。这个方法可以使用,但有点烦人,因为显然Spring有一种机制可以使对象请求范围内(即HttpServletRequest),而这似乎是一个顶部添加的hack。
是否有一种方式可以钩入Spring用于HttpServletRequest的相同机制?还有,Spring团队为什么决定只使HttpServletRequest能够自动装配(并排除HttpServletResponse)?
2个回答

13

也许有一些解决方法,但并不明显,因为这不是它的本意。Spring MVC的@Controller单例bean提供了@RequestMapping方法,该方法将请求和响应作为参数。

如果您需要在其他地方(服务层)使用响应-不要这样做。响应不应超出Web(控制器)层。

要注入响应,您需要: - 将响应存储在ThreadLocal中 - 制作一个工厂bean,返回当前响应

关于您展示的示例代码- 我不确定您是否需要使工厂bean返回代理(实现HttpServletResponse),然后返回当前响应。它变得相当复杂。

但最终-您不应该那样做。如果您需要拦截多个控制器调用,请使用mvc-interceptor。如果确实需要使用方面,则可以在传递为拦截方法的参数时获取响应。


1
不要那么快:如果有一个旨在包装@Controller@Aspect,那怎么办?“这不是预期的方式”这个论点也无法解释为什么HttpServletRequest具有自动装配功能而HttpServletResponse没有。 - Kevin
首先,有拦截器。然后您可以获取方法参数(因此获取响应)。 - Bozho
您提供的链接是我在问题中最初提供的链接。我认为这是一种黑客行为。Spring可以轻松地以与请求相同的方式使响应可用。我的问题是,我是否可以以某种方式钩入该机制,而不是重新发明它。 - Kevin
@Kevin - 我认为你做不到。 - Bozho
2
你说过:“响应不应该超出网络。” 但是如果我需要通过内部逻辑来修改响应 cookie 呢? - voipp
显示剩余6条评论

5

您是否可以将请求简单地包含在方法处理程序中?

@RequestMapping(method=Method.GET, value="myUrl")
public String doGet(HttpServletResponse response){//spring will put the response in for you
  ... 
}

3
他正在寻找一个非控制器 bean 中的响应(我想)。 - Jeremy
好观点,为了他的回应而更新。尽管Bozho有更好的回答。 - John Vint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接