Jsf 2 自定义PhaseListener在JSF2中调用了两次

Jsf 2 自定义PhaseListener在JSF2中调用了两次,jsf-2,Jsf 2,我在JSF2.0中使用PhaseListener。但它的方法每次都会被调用两次 @Override public void beforePhase(PhaseEvent arg0) { System.out.println("Start Phase "+arg0.getPhaseId()+" here the value "+ ++i +" object "+this); } 输出是这样的 Start Phase RESTORE_VIEW 1 here the value 1 ob

我在JSF2.0中使用PhaseListener。但它的方法每次都会被调用两次

@Override
public void beforePhase(PhaseEvent arg0) {
    System.out.println("Start Phase "+arg0.getPhaseId()+" here the value "+ ++i +" object "+this);  
}
输出是这样的

Start Phase RESTORE_VIEW 1 here the value 1 object com.phaseListener.MyPhaseListener@cc8c29
Start Phase RESTORE_VIEW 1 here the value 1 object com.phaseListener.MyPhaseListener@106054a
每次它都被两个不同的对象调用


请让我知道,为什么会这样???

这是因为您已经在JSF应用程序中注册了两次阶段侦听器。这一问题的“原因”反过来也不是建设性的问题。如果您担心同一阶段侦听器被注册两次,只需删除第二次注册。

如果您使用的是Tomcat 7.0.4x,则会出现此问题。尝试将Tomcat降级到至少7.0.39或更低。这个问题很有可能得到解决。我仍然不知道原因,但它起作用了。希望它能帮上忙。

以防有人用谷歌搜索这个问题

在我的例子中,我从GlassFish3迁移到Tomcat7,我注意到我的自定义阶段侦听器被注册了两次,导致了重复的日志条目

在我的web.xml中,我有一个配置监听器,这是Glassfish 3所必需的,但会在Tomcat 7上触发第二次注册:


com.sun.faces.config.ConfigureListener

我只是删除了这个块,它解决了这个问题。

嗨,巴卢斯克,我把你的博客作为参考,我希望你能回答,谢谢你的回答。虽然我没有注册两次。我的faces配置设置为com.phaseListener.MyPhaseListener一个不太可能的原因是在运行时类路径中有两个JSF实现。在我的情况下…它也会被打两次电话。。是否担心性能相关问题,是否会降低应用程序的性能?