2

似乎部分请求不使用由FacesContextFactory实现创建的面孔上下文实例。

UIViewRoot#processDecodes是指示相同的代码

if (context.getPartialViewContext().isPartialRequest() &&
    !context.getPartialViewContext().isExecuteAll()) {
    context.getPartialViewContext().processPartial(PhaseId.APPLY_REQUEST_VALUES);
} else {
    super.processDecodes(context);
}

似乎 PartialViewContext 在其中存储了默认的 FacesContextImpl 实现并使用它来调用生命周期方法。(请注意,processPartial 方法不采用上下文对象,因为它使用自己内部存储的对象)

这是出于特定原因的错误还是其中的代码?

谢谢

4

2 回答 2

3

FacesContext每个线程的实例都是唯一的,并且 The在请求的开头FacesServlet创建 a ThreadLocal<FacesContext>,同时获取(这是与 HTTP servlet 请求关联的响应FacesContext的合同 并在结束时将其删除(通过调用)。FacesContextFactory#getFacesContext)FacesContext#release

每当您FacesContext#getCurrentInstance()在 JSF 代码中执行操作时,您将始终在整个 HTTP servlet 请求/响应处理过程中获得相同的实例。

关于该方法UIViewRoot#processDecodes,我真的没有看到任何可能表明该方法使用它自己创建的实例而不是传递的实例的行。哪条线让你这么想?

可以在FacesServlet#service它创建FacesContextfrom The的方法中看到,这里是显示这一点FacesContextFactory的方法的摘录-FacesServlet#service

// Acquire the FacesContext instance for this request
FacesContext context = facesContextFactory.getFacesContext
   (servletConfig.getServletContext(), request, response, lifecycle);

// Execute the request processing lifecycle for this request
try {
 ...
} catch (FacesException e) {
 ...
}
finally {
 // Release the FacesContext instance for this request
 context.release();
}

考虑到这一点,我觉得UIViewRoot#processDecodes不能拥有FacesContext不是 from 的实例FacesContextFactory

既然你说 - 你已经设置了一些额外的参数来FacesContext返回FacesContextFactory,这意味着你有你自己的自定义实现FacesContextFactory,如果是这种情况,那么你确定你的实例是注入FacesServlet而不是 mojarra 的com.sun.faces.context.FacesContextFactoryImpl(如果你正在使用mojarra)?

于 2011-05-28T19:54:31.953 回答
0

这是我如何让它工作的。下面是我的自定义面孔上下文工厂中的代码

public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle) throws FacesException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;

    ExternalContextFactory externalContextFactory = (ExternalContextFactory) getFactory(FactoryFinder.EXTERNAL_CONTEXT_FACTORY);
    ExternalContext externalContext = externalContextFactory.getExternalContext(context, request, response);

    // CustomFacesContext extends from FacesContextImpl
    CustomFacesContext facesContext = new CustomFacesContext(externalContext, lifecycle);

    ExceptionHandlerFactory exceptionHandlerFactory = (ExceptionHandlerFactory) getFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY);
    ExceptionHandler exceptionHandler = exceptionHandlerFactory.getExceptionHandler();
    facesContext.setExceptionHandler(exceptionHandler);
}
于 2011-12-02T10:10:24.870 回答