部分请求似乎不使用由FacesContextFactory
实现创建的faces上下文实例。
以下是UIViewRoot#processDecodes
中代码相同的代码
if (context.getPartialViewContext().isPartialRequest() &&
!context.getPartialViewContext().isExecuteAll()) {
context.getPartialViewContext().processPartial(PhaseId.APPLY_REQUEST_VALUES);
} else {
super.processDecodes(context);
}
似乎PartialViewContext在其中存储默认的FacesContextImpl实现,并使用它来调用生命周期方法。 (请注意,processPartial方法不接受上下文对象,因为它使用它自己内部存储的对象)
出于特定原因,这是一个错误还是这个代码?
由于
答案 0 :(得分:3)
FacesContext
个实例每个线程都是唯一的,FacesServlet
在获取ThreadLocal<FacesContext>
(FacesContext
的合同时在请求开头创建FacesContextFactory#getFacesContext)
1}}并在与HTTP servlet请求关联的响应结束时删除它(通过调用FacesContext#release
)。
每当您在JSF代码中执行FacesContext#getCurrentInstance()
时,您将始终在整个HTTP Servlet请求/响应处理中获得相同的实例。
关于方法UIViewRoot#processDecodes
,我实际上没有看到任何可能表明该方法使用它自己创建的实例而不是传递的实例的行。哪条线让你觉得呢?
可以在FacesServlet#service
方法中看到它从FacesContext
创建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
实例不属于FacesContextFactory
。
由于您的说法 - 您已为从FacesContext
返回的FacesContextFactory
设置了一些其他参数,这意味着您拥有自己的FacesContextFactory
自定义实现,如果这是那么你确定你的实例是注入FacesServlet
而不是mojarra的com.sun.faces.context.FacesContextFactoryImpl
(如果你使用的是mojarra)吗?
答案 1 :(得分: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);
}