我有这个 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。所以我不知道该怎么办。
最佳答案
一切皆有可能,而且我确信有一种更简单的方法可以做到这一点,但我放弃了,直接找到了源代码。
UIViewRoot 有一个私有(private)字段 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 规范的原始作者正在哭泣。
关于java - 如何从 JSF 中的 PhaseEvent 获取调用方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301288/