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 回答