2017-06-14 24 views
0

我以前用@Context来访问HttpServletRequest,它的工作。如何使用@Context或类似方法获取任何类中的ServletRequest?

我有,我已经尝试使用此另一个类,但它没有被分配(即requestnull

@Context 
HttpServletRequest request; 

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

那么我怎样才能得到request.getParameter("username")request分配为空?

+1

什么样的_class_?它由泽西岛管理(或者你正在使用的任何框架)?这就是'@ Context'的过程。 –

+0

是的,该类不是从任何特殊派生(对象)....是否有一些通用的方式,我可以派生类的东西,使其上下文HttpServletContext? –

+2

这不是关于继承层次结构。类的实例必须由容器管理。我对JAX RS不了解足够的细节。 –

回答

0

我发现我能做到的唯一方法就是将它传递给调用堆栈,尽管我设法使用Guice缩短了调用堆栈approach。

要做到这一点,我结合我的供应商的要求,像这样: 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); 
    } 
} 

时创建我的课所以,现在,它有请求上下文可用。

0

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

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

通常情况下,如果您需要某个对象的东西,通常最好将它传递给调用堆栈。如果您无法使用,那么您可以尝试使用ThreadLocal的基于Filter的解决方案。尽管如此,但如果可能的话,尽可能地将它传递给调用堆栈。

相关问题