如何使用@Context或类似的方法在任何类中获取ServletRequest?

时间:2017-06-14 18:37:18

标签: java servlets jax-rs

我过去曾使用@Context来访问HttpServletRequest,但它确实有效。

我有另一个课程,我试图使用它,但它没有被分配,(即requestnull

@Context
HttpServletRequest request;

我所要做的就是在类中获取请求参数,而不必将它们传递给每个父实例。

那么当request.getParameter("username")分配为空时,如何才能获得request

2 个答案:

答案 0 :(得分:0)

您的@Context无法正常工作的原因很可能是因为它不是您的服务器的托管对象,因此服务器甚至不知道执行此注入的请求。

其他潜在问题包括您将HttpServletRequest声明为实例变量,在这种情况下,您将遇到线程问题。实际上,某个容器不会在类级别上注入@Context,它必须在方法级别上。

通常,如果您需要来自对象的内容,通常最好将其传递给调用堆栈。如果您无法使用,则可以尝试使用Filter的基于ThreadLocal的解决方案。但这会变得混乱,所以尽可能努力将其传递给调用堆栈。

答案 1 :(得分:0)

我发现我能做到这一点的唯一方法是将它传递给调用堆栈,尽管我确实设法使用Guice缩短了调用堆栈的使用时间。

为此,我将Provider绑定到请求中,如下所示:         bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);

我的提供商看起来像这样:

public static class MyClassProvider implements Provider<MyClass>
{
    private HttpServletRequest request;

    @Inject
    public MyClassProvider(@Context HttpServletRequest request)
    {
        this.request = request;
    }

    @Override
    public MyClass get()
    {
        return new MyClass(request);
    }
}

所以现在当我的类被创建时,它有Request上下文可用。