我过去曾使用
@Context
访问 HttpServletRequest
,并且成功了。
我有另一个课程,我尝试使用它,但它没有被分配,(即
request
是null
)
@Context
HttpServletRequest request;
我想做的就是获取类中的请求参数,而不必将它们传递给每个父实例。
那么当
request.getParameter("username")
被赋值为 null 时,我怎样才能得到 request
呢?
您的 @Context 不起作用的原因很可能是因为它不是您的服务器的托管对象,因此服务器甚至不知道进行此注入的请求。
其他潜在问题包括将 HttpServletRequest 声明为实例变量,在这种情况下,您将遇到线程问题。事实上,某些容器不会在类级别注入@Context,它必须在方法级别注入。
通常,如果您需要对象中的某些内容,通常最好将其传递到调用堆栈中。如果您无法,那么您可以尝试使用
Filter
的基于 ThreadLocal
的解决方案。但这会变得混乱,所以如果可能的话,请努力将其传递到调用堆栈中。
我发现可以做到这一点的唯一方法是将其传递到调用堆栈中,尽管我确实设法使用 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);
}
}
所以现在当我的类被创建时,它就有了可用的请求上下文。
另一种解决方案是创建一个新的 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());