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

标签 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。所以我不知道该怎么办。

最佳答案

一切皆有可能,而且我确信有一种更简单的方法可以做到这一点,但我放弃了,直接找到了源代码。

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/

相关文章:

multithreading - 如何在PhaseListener的beforePhase()和afterPhase()方法之间线程安全地共享属性?

java - 带有 Spring IOC 的推土机映射器单例实例

java - 二元运算符 "-"第一个类型 : int; second type: java. lang.String 的错误操作数类型

java - hibernate 错误:- Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]

jsf - 更改jsf中的日期格式

java - JSF 按钮未显示

java - 如何在所有过滤器之前运行 PhaseListener?

java - 更新到 Spring Boot 2 后 Jackson 模块未注册

redirect - JSF/Mojarra ExternalContext.redirect() 创建一个 HttpSession

jsf - 使用 JSF 2.3 时,是否可以将 bean 注入(inject) phaselistener,tomcat 与 weld cdi 实现?