Как переопределить класс API компонента Primefaces с помощью пользовательского класса

Я столкнулся с проблемой дублирования идентификаторов для столбцов в p:treeTable, т.е. той же проблемой, что описана в приведенной ниже ссылке.

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

Поэтому я хотел бы реализовать решение, предложенное в приведенном выше решении. Поэтому я подумал об изменении исходного кода, перекомпиляции и использовании jar, но у меня нет разрешения сделать то же самое. Меня попросили настроить класс, расширив класс org.primefaces.component.api.UITree или каким-то образом не меняя фактический класс в банке Primefaces.

Итак, теперь предположим, что я создал класс с таким же именем UITree и внес необходимые изменения. Есть ли способ зарегистрировать этот класс, чтобы мой класс можно было использовать вместо класса Primefaces?


person Srikanth Ganji    schedule 02.09.2014    source источник


Ответы (2)


У вас есть 2 варианта:

  1. Просто поместите его в исходную папку Java проекта WAR, сохранив исходную структуру пакета (таким образом, имея точно такое же полное доменное имя). Классы в WAR имеют более высокий приоритет при загрузке классов по сравнению с классами в JAR в WAR /WEB-INF/lib. Таким образом, если точно такой же класс (по FQN) встречается в WAR, то он будет загружен из 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>
    

    Также здесь любой класс компонента, зарегистрированный в faces-config.xml WAR, имеет более высокий приоритет по сравнению с классом в faces-config.xml JAR (в данном конкретном случае класс PrimeFaces).

person BalusC    schedule 02.09.2014
comment
Спасибо за ответ. Я нашел способ сделать это, и я считаю, что это тоже проще, что я опубликовал в качестве ответа. Спасибо за войну и приоритет банок. Узнал что-то новое :) - person Srikanth Ganji; 02.09.2014

После некоторых усилий я нашел способ решить мою проблему

Я написал класс, который расширяет класс 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>  

Я считаю, что это самый простой способ и решил мою проблему. Отвечая на мой собственный вопрос, чтобы он мог помочь другим.

person Srikanth Ganji    schedule 02.09.2014