JSF2以编程方式取消订阅全局系统事件侦听器

时间:2013-07-06 09:33:56

标签: jsf-2 primefaces

有没有办法在JSF2中以编程方式取消订阅全局系统事件侦听器,该侦听器由第三方(jsf 2)相关jar通过其自己的faces-config.xml添加?

我了解javax.faces.application.Applicationhttp://docs.oracle.com/javaee/6/api/index.html?javax/faces/application/Application.html)中有两种方法可以取消订阅,其中一种方法是unsubscribeFromEvent(java.lang.Class<? extends SystemEvent> systemEventClass, java.lang.Class<?> sourceClass, SystemEventListener listener)

上述方法的前两个参数很好,但我们如何获得先前注册的侦听器对象。

为什么我需要取消订阅才能为侦听器提供自定义行为。也可以通过PostConstructApplicationEvent(http://docs.oracle.com/javaee/6/api/javax/faces/event/PostConstructApplicationEvent.html)类型的系统事件的另一个全局系统事件监听器来完成吗?

需要:我们在基于网络的项目中大量使用Prime Faces(PF)和Omni Faces(OF)。在PF中,我们定制了DataTable和DataTableRenderer,以便在header和tbody部分中对静态和动态列进行复杂的混合。最近我移植到PF ver 4并且一切正常但最近PF快照添加了一个名为DynamicColumnsListener的新系统事件监听器,这个监听器的行为给我们带来了问题。这就是为什么我需要取消订阅这个监听器并为我已经实现的扩展提供我自己的自定义监听器。

更新:PrimeFaces事件监听器的实现DynamicColumnsListener的processEvent方法是

    Columns columns = (Columns) event.getSource();        
    ((DataTable) columns.getParent()).setDynamicColumns(columns);

根据PrimeTaces DataTable和DataTableRenderer的实现,这一切都很好但是在我的扩展中我也可以在“header”facet中有动态列,然后它的父是org.primefaces.component.row.Row而不是DataTable所以它会遇到ClassCastException,因为它在标题facet中的父级不是DataTable而是Row。

0 个答案:

没有答案