MyFacesでRederectした際のライフサイクル

faces-config.xmlの遷移定義でを書くと、それに該当する画面遷移はRedirectとなる。
Redirectのレスポンスを返す場合、レスポンスにちょっとした仕掛けをしたいのだけど、PhaseListenerで出来るのかな?という疑問。

結論から言うと出来そうな感じ。

なんでそんな疑問が出たかというと、Redeirectの場合ってどこまでライフサイクルが進むのだろうか?と考えたのが原因。
INVOKE_APPLICATIONまで行われるのは確実なんだけど、INVOKE_APPLICATIONのafterPhaseでPhaseListenerが実行されるのか?ということ
次画面のviewIDが欲しかったので、INVOKE_APPLICATIONのafterPhaseでPhaseListenerが動いていないのであれば、別の方法を模索する必要がある。

と、いう事情で調べてみた。調査にはもちろんPhaseListenerを使用。

package test;


import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;


public class TestPhaseListener implements PhaseListener {


    public void afterPhase(PhaseEvent event) {
        TestUtil.doPrintLog(this, createLogString(event, "[afterPhase]"));
    }


    public void beforePhase(PhaseEvent event) {
        TestUtil.doPrintLog(this, createLogString(event, "[beforePhase]"));
    }


    private String createLogString(PhaseEvent event, String PhaseTiming) {
        StringBuilder logStr = new StringBuilder();


        logStr.append(PhaseTiming);
        logStr.append(event.getPhaseId().toString());


        return logStr.toString();
    }


    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

}


結果

[beforePhase]RESTORE_VIEW(1)
[afterPhase]RESTORE_VIEW(1)
[beforePhase]APPLY_REQUEST_VALUES(2)
[afterPhase]APPLY_REQUEST_VALUES(2)
[beforePhase]PROCESS_VALIDATIONS(3)
[afterPhase]PROCESS_VALIDATIONS(3)
[beforePhase]UPDATE_MODEL_VALUES(4)
[afterPhase]UPDATE_MODEL_VALUES(4)
[beforePhase]INVOKE_APPLICATION(5)
[afterPhase]INVOKE_APPLICATION(5)
[beforePhase]RESTORE_VIEW(1)
[afterPhase]RESTORE_VIEW(1)
[beforePhase]RENDER_RESPONSE(6)
[afterPhase]RENDER_RESPONSE(6)

INVOKE_APPLICATIONのafterPhaseが実行されている。

これで簡単に出来そうだ。でももしかしたらLifeCycleの実装によるのかもしれない。そこまでは調べてない。