Является ли это ошибкой Primefaces или ошибкой Mojarra/MyFaces
Кажется, я не могу запустить событие, когда я в column
dataTable
. Вот моя простая демонстрация
<h:form id="form">
<!--This section of p:tree here seems to be the reason causing the event not fired when click the command button-->
<p:tree value="#{viewBean.root}" var="node" dynamic="true" cache="false"
selectionMode="checkbox" selection="#{treeBean.selectedNode}">
<p:ajax event="expand" update=":form:messages" listener="#{viewBean.onNodeExpand}" />
<p:ajax event="collapse" update=":form:messages" listener="#{viewBean.onNodeCollapse}" />
<p:ajax event="select" update=":form:messages" listener="#{viewBean.onNodeSelect}" />
<p:ajax event="unselect" update=":form:messages" listener="#{viewBean.onNodeUnselect}" />
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
<h:panelGroup id="mygroup">
<p:dataTable id="mytable" value="#{viewBean.foodList}" var="item">
<p:column>
#{item}
</p:column>
<p:column>
<p:commandButton value="delete"
action="#{viewBean.delete}"
update=":form:mygroup">
<f:setPropertyActionListener target="#{viewBean.selectedFood}"
value="#{item}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:panelGroup>
</h:form>
и вот мой управляемый bean
@ManagedBean
@ViewScoped
public class ViewBean {
private TreeNode root;
private TreeNode selectedNode;
private List<String> foodList;
private String selectedFood;
@PostConstruct
public void init(){
foodList = new ArrayList<String>();
foodList.add("Pizza");
foodList.add("Pasta");
foodList.add("Hamburger");
root = new DefaultTreeNode("Root", null);
TreeNode node0 = new DefaultTreeNode("Node 0", root);
TreeNode node1 = new DefaultTreeNode("Node 1", root);
TreeNode node2 = new DefaultTreeNode("Node 2", root);
TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);
TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);
TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);
TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
}
public void delete(){
foodList.remove(selectedFood);
}
//setter and getter
public void onNodeExpand(NodeExpandEvent event) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Expanded", event.getTreeNode().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
public void onNodeCollapse(NodeCollapseEvent event) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Collapsed", event.getTreeNode().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
public void onNodeSelect(NodeSelectEvent event) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", event.getTreeNode().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
public void onNodeUnselect(NodeUnselectEvent event) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unselected", event.getTreeNode().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
Моя проблема заключается в том, что событие не запускается, а значение delete
никогда не запускается.
Я смотрю вокруг и знаю, что у Mojarra много проблем с вложенными компонентами UIData, поэтому я попробовал Mojarra 2.1.4, все еще не решил проблему. Я попробовал Myfaces 2.1.5, все еще не работает!!! Является ли это ошибками Primefaces? Я даже использую h:panelGroup
в качестве обертки для update
, но он все еще не работает.
EDIT. Оказывается, что p:tree
выше dataTable
является основной причиной события, которое не запускается при нажатии commandButton
. Если я удалю p:tree
, тогда он будет работать немедленно. Обратите внимание, что сам p:tree
отлично работает, когда я нажимаю на checkout, событие запускается на моем управляемом bean.
Ответы
Ответ 1
Это ошибка в вашем собственном коде.
<partial-response>
<error>
<error-name>class javax.el.ELException</error-name>
<error-message><![CDATA[/index.xhtml @15,84 selection="#{viewBean.selectedNode}": Cannot convert [Lorg.primefaces.model.TreeNode;@fd9b4d of type class [Lorg.primefaces.model.TreeNode; to interface org.primefaces.model.TreeNode]]></error-message>
</error>
</partial-response>
Конкретное сообщение об исключении предполагает, что ожидается, что <p:tree selection>
ссылается на свойство типа TreeNode[]
, а не TreeNode
(обратите внимание на префикс [
в идентификаторе класса в сообщении, который указывает тип массива). Итак, исправьте его соответствующим образом:
<p:tree selection="#{treeBean.selectedNodes}">
с
private TreeNode[] selectedNodes;
Независимо, у вас есть как <p:tree>
, так и <p:dataTable>
внутри одной и той же формы "бог". Таким образом, любое действие в любом из них также отправит все на другой компонент. Если дерево и таблица никоим образом не связаны друг с другом, каждый из них должен быть помещен в свой собственный <h:form>
. Или вы должны добавить атрибут process
к командам/кнопкам команд для обработки только интересующего компонента, например. process="mytable"
на кнопке внутри таблицы.