JSF 2部分请求不使用Factory的FacesContext

时间:2011-04-15 16:23:19

标签: ajax jsf jsf-2 mojarra facescontext

部分请求似乎不使用由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方法不接受上下文对象,因为它使用它自己内部存储的对象)

出于特定原因,这是一个错误还是这个代码?

由于

2 个答案:

答案 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);
}