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インスタンスはスレッドごとに一意であり、 は を取得しながらリクエストの開始時に をFacesServlet作成します(これは のコントラクトで あり、HTTP サーブレット リクエストに関連付けられた応答の最後で ( を呼び出すことにより) 削除します)。ThreadLocal<FacesContext>FacesContextFacesContextFactory#getFacesContext)FacesContext#release

JSF コードでa を実行するFacesContext#getCurrentInstance()と、HTTP サーブレットの要求/応答処理全体で常に同じインスタンスが取得されます。

メソッドについては、メソッドUIViewRoot#processDecodesが渡されたインスタンスではなく、独自に作成されたインスタンスを使用していることを示す可能性のある行は実際にはありません。そう思わせたセリフは?

からFacesServlet#serviceを作成するメソッドで見ることができます。これを示すメソッドからの抜粋を次に示します-FacesContextFacesContextFactoryFacesServlet#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持つことはできないと思います。FacesContextFacesContextFactory

あなたが言っているので -FacesContextから返されるいくつかの追加パラメータを に設定しましたFacesContextFactory。つまり、 の独自のカスタム実装があることを意味します。FacesContextFactoryこの場合、インスタンスがFacesServletmojarra ではなくに注入されていることを確認していますcom.sun.faces.context.FacesContextFactoryImplか?あなたはmojarraを使用していますか)?

于 2011-05-28T19:54:31.953 に答える
0

これが私がそれを機能させる方法です。以下は、私のカスタム Faces コンテキスト ファクトリのコードです。

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 に答える