2

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

javax.faces.application.Application我知道(http://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)的另一个全局系统事件侦听器来完成吗?

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

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

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

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

4

1 回答 1

0

在这种特定情况下,您可以只覆盖 Columns 组件。

package com.company;

public class Columns extends org.primefaces.component.columns.Columns {
}

在 faces-config.xml 中:

<component>
    <component-type>org.primefaces.component.Columns</component-type>
    <component-class>com.company.Columns</component-class>
</component>

由于 DynamicColumnsListener 是专门附加到的org.primefaces.component.columns.Columns,因此它不适用于覆盖的组件。

或者,也许您可​​以通过反射技巧获得侦听器实例,例如通过调用 Mojarra 的com.sun.faces.application.ApplicationImpl#getListeners.

于 2021-12-13T18:43:56.593 回答