3

私はこのPhaseListnerを持っています:

public class CheckAccessInterceptor implements PhaseListener {
    private static final long serialVersionUID = -311454347719850720L;
    private static Logger logger = Logger.getLogger(CheckAccessInterceptor.class);

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

    public void beforePhase(PhaseEvent event) {
        System.out.println("START PHASE " + event.getPhaseId());
    }

    public void afterPhase(PhaseEvent event) {
        System.out.println("END PHASE " + event.getPhaseId());
    }

}

PhaseEventオブジェクトからManagedBeanの名前と呼び出されたメソッドの名前を取得することは可能ですか?どのように?

更新しました:

ここで解決策を見つけましたが、Ajaxでは機能しないようです。だから私は何をすべきかわからない。

4

2 に答える 2

2

何でも可能であり、これを行うためのはるかに簡単な方法があると確信していますが、私はあきらめてソースに直行しました。

UIViewRoot にはevents、INVOKE APPLICATION フェーズ中に、それぞれのフェーズでブロードキャストするすべてのイベントを含むリストのリストを持つプライベート フィールドがあります。これを行う唯一の方法は、リフレクションを使用してそのリストを取得することです。

Field field = UIViewRoot.class.getDeclaredField("events");
field.setAccessible(true);
ArrayList<ArrayList<SystemEvent>> events =
  (ArrayList<ArrayList<SystemEvent>>)field.get(
     FacesContext.getCurrentInstance().getViewRoot());

for (ArrayList<SystemEvent> phaseEvents : events) {
   for (SystemEvent event : phaseEvents) {
      // is this the event you are looking for?
   }
}

Gosling と JSF 仕様の元の作成者が泣いているのをどこかで聞いていると思います。

于 2012-09-06T18:51:03.683 に答える
1

だから正しい答えはここにあります

しかし、私はあなたに警告しなければなりません、それはアクションリストではなく、アクションでのみ機能します。

maple_shaftのソリューションも機能しますが、私の意見ではBalusCのソリューションの方が優れています。

于 2012-09-10T05:56:33.773 に答える