Spring MVC-我可以在RestController中自动装配HttpServletRequest吗
问题内容:
我可以按照以下方式自动接线吗HttpServletRequest
,即使它在高度并发的环境中执行,它RestController
也会返回不同的结果吗servletRequest
?我有一个限制,我不能将其作为方法参数,因为我实现的是一个自动生成的接口,而不会HttpServletRequest
作为方法参数。
@RestController
public class MyController implements MyInterface {
@Autowired
private HttpServletRequest servletRequest;
@Override
@RequestMapping(value = "/test", produces = {"application/json"}, consumes = {"application/json"}, method = RequestMethod.POST)
public ResponseEntity<MyResponse> test(@RequestBody final MyRequest payload){
...
}
...
}
我经历了这些SO问题以及与此相关的其他文章。但是只是想确保当我们HttpServletRequest
在控制器中自动接线时,其 范围 是_Request_ ?
注意:
我确实尝试过此方法,但似乎工作正常。但是只是想确认一下,即使在高度并发的环境中,这也是一个万无一失的解决方案。同样,如果这是正确的方法,那么如果有人可以解释它是如何工作的,我将不胜感激。
问题答案:
我已经用过了,效果很好。但不幸的是,我没有找到任何官方文件提及此功能。
这是基于我的理解的解释,我的理解是通过运行具有不同标头/有效负载等的多个请求来调试代码:
无论是现场自动装配还是通过构造函数自动装配,servletRequest
都像Proxy对象一样,将调用委派给 Current
HttpServletRequest
,每个请求均不同。因此,即使通过构造函数将其注入到Singleton RestController中
,它仍将为每个新请求将调用委派给相应的HttpServletRequest。这利用AutowireUtils.ObjectFactoryDelegatingInvocationHandler访问当前的HttpServletRequest对象。它的Java文档还说
Reflective InvocationHandler可以延迟访问 当前目标对象 。
因此,即使自动连接的Proxy对象对于所有请求始终都是相同的,将调用委派给其的基础目标对象是每个请求的当前HttpServletRequest对象。
HttpServletRequest currentRequest =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
注意: 由于此说明是基于我的理解,因此,如果有人知道,请共享任何官方文档。