Java 如何调用方法';JSF中PhaseeEvent的名称

Java 如何调用方法';JSF中PhaseeEvent的名称,java,jsf,phaselistener,Java,Jsf,Phaselistener,我有一个相位指示器: public class CheckAccessInterceptor implements PhaseListener { private static final long serialVersionUID = -311454347719850720L; private static Logger logger = Logger.getLogger(CheckAccessInterceptor.class); @Override pub

我有一个相位指示器:

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());
    }

}
是否可以从PhaseeEvent对象获取ManagedBean的名称和调用的方法的名称?怎么做

更新:


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

任何事情都是可能的,我相信有一种更简单的方法可以做到这一点,但我放弃了,直接去了源头

UIViewRoot有一个私有字段
events
,在调用应用程序阶段,该字段将有一个列表,其中包含每个阶段要广播的所有事件。我能想到的唯一方法是使用反射来获得该列表

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?
   }
}
Field-Field=UIViewRoot.class.getDeclaredField(“事件”);
字段。setAccessible(true);
ArrayList事件=
(ArrayList)field.get(
FacesContext.getCurrentInstance().getViewRoot());
for(ArrayList阶段事件:事件){
用于(系统事件:阶段事件){
//这是你要找的活动吗?
}
}
我想在某个地方我听到高斯林和JSF规范的原始作者正在哭泣。

所以正确的答案是

但我必须警告你,它只适用于动作,而不适用于动作列表


maple_shaft的解决方案也有效,但我认为BalusC的解决方案更好。

@潜水员:是的。我刚刚在调用应用程序的Before PhaseEvent中运行了这段代码,找到了我的
AjaxBehaviorEvent
。如果没有看到该事件,则Ajax回发不会执行该事件。听起来你好像出了什么问题。他们不仅如此,我还哭了:)@BalusC你哭是因为我们破坏了JSF中的封装还是因为你希望我们不必这么做?:)我更新了你发现的答案,使之与ajax兼容。