如何使用自定义类覆盖primefaces组件api类

时间:2014-09-02 14:28:02

标签: jsf-2 primefaces jsf-2.2

我在p:treeTable面临列重复的问题,即下面链接中描述的相同问题

http://forum.primefaces.org/viewtopic.php?f=3&t=31158&p=99463#p99463

所以我想按照上面的解决方案的建议实现解决方案。所以我想改变源代码并重新编译并使用jar但我还没有获得同样的许可。我被要求通过扩展org.primefaces.component.api.UITree类来自定义类,或者不改变primefaces jar中的实际类。

所以现在假设我已经创建了一个具有相同名称UITree的类,并为我做了必要的更改。无论如何都要注册这个类,以便我的类可以用来代替primefaces类

2 个答案:

答案 0 :(得分:3)

你有两个选择:

  1. 只需将其放在WAR项目的Java源文件夹中,保持原始包结构(因此,具有完全相同的FQN)。 WAR中的类优先于WAR /WEB-INF/lib中JAR中的类加载优先级。因此,如果在WAR中遇到完全相同的类(通过FQN),那么它将从WAR而不是从JAR加载(在这种特殊情况下,PrimeFaces的一个)。

  2. faces-config.xml的组件类型的WAR项目的<p:treeTable>中注册组件类:

    <component>
        <component-type>org.primefaces.component.TreeTable</component-type>
        <component-class>com.example.component.CustomTreeTable</component-class>
    </component>
    

    此外,在WAR faces-config.xml中注册的任何组件类优先于JAR faces-config.xml中的组件类(在此特定情况下,PrimeFaces中的组件类)。

答案 1 :(得分:0)

经过一番努力,我找到了解决问题的方法

我编写了一个类,它扩展了如下所示的primefaces TreeTable类,并实现了链接中指定的方法visitColumns(在我的问题中给出)。

您必须覆盖子类中调用visitColumns方法的所有方法。

现在将其注册到faces-config.xml中,如下所示

 <component>
    <component-type>org.primefaces.component.TreeTable</component-type>
    <component-class>com.example.component.MyTreeTable</component-class>
 </component>  

我相信这是最简单的方法并解决了我的问题。回答我自己的问题,这样可以帮助别人。