我过去曾使用@Context
来访问HttpServletRequest
,但它确实有效。
我有另一个课程,我试图使用它,但它没有被分配,(即request
是null
)
@Context
HttpServletRequest request;
我所要做的就是在类中获取请求参数,而不必将它们传递给每个父实例。
那么当request.getParameter("username")
分配为空时,如何才能获得request
?
答案 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上下文可用。