Всем добрый день!
Сегодня рассмотрим такую проблему, как неработающая фильтрация по полю узла p:tree в Primefaces 6.2.
В данном примере строится дерево из элементов, имеющих поле name и должна осуществляться фильтрация по этому полю, однако этого не происходит.
<p:tree value="#{customBean.treeRoot}" var="node" filterBy="#{node.name}">
<p:treeNode>
<h:outputText value="#{node.name}"/>
</p:treeNode>
</p:tree>
Проблема заключается в том, что фильтр данного компонента игнорирует поля, которые указываеются в filterBy и осуществляет фильтрацию по toString() узла.
Решение проблемы приходит само собой - необходимо написать класс-оболчку, который в toString() будет возращать необходимое нам поле, по которому мы будет осуществлять фильтрацию. А так же getName(), возвращающий значение поля name исходного объекта. Код такого класса довольно очевиден, приводить его не буду. Однако, в самом компоненте необходимо изменить filterBy="#{node.name}" на filterBy="#{node}"
<p:tree value="#{customBean.treeRoot}" var="node" filterBy="#{node}">
<p:treeNode>
<h:outputText value="#{node.name}"/>
</p:treeNode>
</p:tree>
Надеюсь этот хинт кому-нибудь поможет.