如何从JSF中的PhaseEvent获取调用方法的名称

时间:2012-09-06 13:32:52

标签: java jsf phaselistener

我有这个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的名称和调用方法的名称?怎么样?

更新:

我找到解决方案here,但看起来它不适用于Ajax。所以我不知道该怎么做。

2 个答案:

答案 0 :(得分: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规范的原作者现在哭了。

答案 1 :(得分:0)

所以正确答案是here

但是我必须警告你,它只与行动有关,而不是行动者。

maple_shaft 的解决方案也有效,但在我看来 BalusC 的解决方案更好。