Spring:如何将HttpServletRequest注入请求范围的bean?

Leo*_*nel 93 java spring servlets

我正在尝试在Spring中设置一个请求范围的bean.

我已成功设置它,因此每次请求都会创建一次bean.现在,它需要访问HttpServletRequest对象.

由于每次请求都会创建一次bean,因此我认为容器可以很容易地在我的bean中注入请求对象.我怎样才能做到这一点 ?

sam*_*aur 128

Spring 通过类型的包装器对象公开当前HttpServletRequest对象(以及当前HttpSession对象).此包装器对象绑定到ThreadLocal,并通过调用该方法获得.ServletRequestAttributesstaticRequestContextHolder.currentRequestAttributes()

ServletRequestAttributes提供getRequest()获取当前请求的方法,获取getSession()当前会话和其他方法以获取存储在两个范围中的属性.以下代码虽然有点难看,但应该在应用程序的任何位置获取当前请求对象:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
Run Code Online (Sandbox Code Playgroud)

请注意,该RequestContextHolder.currentRequestAttributes()方法返回一个接口,需要进行类型转换才能ServletRequestAttributes实现接口.


Spring Javadoc: RequestContextHolder | ServletRequestAttributes

  • 注入是很好的解决方案,但我发现MockMvc测试注入HttpServletRequest的Spring验证器有问题.因此,如果您希望模拟测试和生产代码都正常运行,那么这应该是您的选择. (7认同)

ska*_*man 106

请求范围的bean可以与请求对象一起自动装配.

private @Autowired HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)

  • 也可以将HttpServletRequest自动装入非请求范围的bean中,因为对于HttpServletRequest,Spring将生成一个代理HttpServletRequest,它知道如何获取实际的请求实例.因此,即使您的控制器是单一作用域,也可以安全地自动发送请求. (19认同)
  • 是否有一种老式的XML方式? (2认同)
  • 对我不起作用(spring mvc 3.1) - 也许还有更多东西需要做?选择Samit的解决方案. (2认同)
  • 问题是,当你使用MockMvc和这种注入测试验证器时,你会遇到问题.可能是其他解决方案在这种情况下将是首选 (2认同)
  • **对于<= 3.1用户**的警告**自动装配将无法运行测试. (2认同)

Wil*_*ill 8

正如此处建议的,您还可以注入HttpServletRequest作为方法参数,例如:

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)