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

问题描述 投票:0回答:3

我过去曾使用

@Context
访问
HttpServletRequest
,并且成功了。

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

request
null

@Context
HttpServletRequest request;

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

那么当

request.getParameter("username")
被赋值为 null 时,我怎样才能得到
request
呢?

java servlets jax-rs
3个回答
0
投票

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

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

通常,如果您需要对象中的某些内容,通常最好将其传递到调用堆栈中。如果您无法,那么您可以尝试使用

Filter
的基于
ThreadLocal
的解决方案。但这会变得混乱,所以如果可能的话,请努力将其传递到调用堆栈中。


0
投票

我发现可以做到这一点的唯一方法是将其传递到调用堆栈中,尽管我确实设法使用 Guice 缩短了调用堆栈方法。

为此,我将我的提供者绑定到请求,如下所示:

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
投票

另一种解决方案是创建一个新的 FacesContext 并将其设置为 Web 服务内的当前实例,或者您有 HttpServletRequest 实例。

FacesContextforWebServices facesContextforWebServices=new FacesContextforWebServices();         facesContextforWebServices.setSessionValue(httpServletRequest,httpServletResponse,"#{sessionScope.username}",username);

用于创建FacesContext实例的类。

public class FacesContextforWebServices {
public void setValue(HttpServletRequest request, HttpServletResponse response, String expression, Object value) {
    FacesContext facesContext = getFacesContext(request, response);
    facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(), expression, Object.class).setValue(facesContext.getELContext(), value);
}
protected FacesContext getFacesContext(HttpServletRequest request, HttpServletResponse response) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (facesContext == null) {

        FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
        LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
        Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

        facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(), request, response, lifecycle);

        FacesContextforWebServices.InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);

        UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, "");
        facesContext.setViewRoot(view);
    }
    return facesContext;
}

private abstract static class InnerFacesContext extends FacesContext {
    protected static void setFacesContextAsCurrentInstance(FacesContext facesContext) {
        FacesContext.setCurrentInstance(facesContext);
    }
}

}

可以通过

获取参数
FacesContext.getCurrentInstance().getApplication().getExpressionFactory()  .createValueExpression(FacesContext.getCurrentInstance().getELContext(),expression,Object.class).getValue(FacesContext.getCurrentInstance().getELContext());
© www.soinside.com 2019 - 2024. All rights reserved.