从Spring访问普通Java类中的HttpServletRequest对象
问题内容:
我在Spring MVC 3.06 Web应用程序中有一个普通的Java类。
在此类中,我想HttpServletRequest
在方法中注入或获取对象。
我知道我可以将其传递给我,但是我想知道如何在不将请求传递给方法的情况下抓住请求。也许使用注释或类似方法?
同样,用这种方式来保持请求的“真正”关注点是什么,除了一些人认为丑陋的编码之外。我的意思是,以这种方式访问它是否不稳定?
优选地,非依赖于应用服务器的方式。
我见过
(HttpServletRequest) RequestContextHolder.getRequestContext().getExternalContext().getNativeRequest()
但这似乎不适用于Spring MVC 3.06。RequestContextHolder
没有方法getRequestContext()
。
问题答案:
采用
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
我不确定你从哪里来RequestContextHolder.getRequestContext()
,那是完全错误的。
这样访问是否不稳定?
不,假设您始终将代码作为HttpServlet
请求线程的一部分运行,它足够稳定。主要问题是,是的,它很丑陋,并且使您的代码难以测试。这就是没有使用它的理由。
如果 必须 使用它,则将其与代码分离,例如
public void doSomething() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
doSomething(request);
}
void doSomething(HttpServletRequest request) {
// put your business logic here, and test this method
}