我有这个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。所以我不知道该怎么做。
答案 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)