从Spring访问普通Java类中的HttpServletRequest对象

时间:2012-03-19 09:12:51

标签: java servlets spring-mvc

我在Spring MVC 3.06 Web应用程序中有一个普通的Java类。

在本课程中,我想在方法中注入或获取HttpServletRequest对象。

我知道我可以传递这个,但我想知道如何在不将其传递给方法的情况下获取请求。也许使用注释或类似的东西?

此外,以这种方式获取请求的“真实”问题是什么,除了一些人认为它是丑陋的编码。我的意思是,以这种方式访问​​它是否不稳定?

最好不依赖于应用服务器的方式。

我见过

(HttpServletRequest) RequestContextHolder.getRequestContext().getExternalContext().getNativeRequest() 

但这似乎不适用于Spring MVC 3.06。 RequestContextHolder没有方法getRequestContext()

2 个答案:

答案 0 :(得分:28)

使用

((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
}

答案 1 :(得分:0)

@Context HttpServletRequest httpServletRequest = null;

使用此