【发布时间】:2015-07-06 08:09:56
【问题描述】:
我正在尝试以高级模式实现 primefaces selectManyMenu,如展示中所示,但无法使其工作。
不过,它非常适合 selectOneMenu。
这是我的 selectOneMenu 代码:
<p:selectOneMenu id="param" value="#{containerResultBean.selectedParam}"
converter="omnifaces.SelectItemsConverter" var="pa"
filter="true" filterMatchMode="contains" >
<f:selectItem itemLabel="Select questions" itemValue="" />
<f:selectItems value="#{containerResultBean.paramList}"
var="parameter" itemLabel="#{parameter.name}"
itemValue="#{parameter}"/>
<p:column >
<h:outputText styleClass="mediumFont" value="#{pa.name}"/>
<h:outputText styleClass="mediumFont" value="#{pa.category.name}"/>
</p:column>
</p:selectOneMenu>
对于 selectManyMenu
<p:selectManyMenu id="param" value="#{containerResultBean.selectedParamsList}"
converter="omnifaces.SelectItemsConverter" var="pa"
filter="true" filterMatchMode="contains" >
<f:selectItem itemLabel="Select questions" itemValue="" />
<f:selectItems value="#{containerResultBean.paramList}"
var="parameter" itemLabel="#{parameter.name}"
itemValue="#{parameter}"/>
<p:column >
<h:outputText styleClass="mediumFont" value="#{pa.name}"/>
<h:outputText styleClass="mediumFont" value="#{pa.category.name}"/>
</p:column>
</p:selectManyMenu>
我收到一个错误value="#{pa.name}": The class 'java.lang.String' does not have the property 'name'.
我已经检查了我的equal()、hashcode() 和toString() 方法。我认为如果这些方法有问题,那么selectOneMenu 也不应该起作用。
请注意,当我删除 var='pa' 和 <column ...> 时,它可以正常工作。
【问题讨论】:
-
containerResultBean.selectedParamsList是 list 对象吗?似乎pa被当作一个字符串对象。 -
@Miguel 是的, selectedParamsList 是一个列表对象。
private List<Param> selectedParamsList = new ArrayList<>(); -
@Miguel 我不明白为什么它在 ManyMenu 而不是 OneMenu 中被视为 String 对象?
-
@Miguel 谢谢,但是 Omnifaces 转换器正在使用该类的 toString 方法,并且类似于他自己实现的方法。 Converter 只是将 Entity 对象转换为 String 并从 String 转换回 Entity。因此,如果转换器出现问题,OneMenu 也不应该工作。这就是我对转换器的理解..
-
此外,转换器仅适用于
<f:selectItem(s)>,不适用于自定义表示。
标签: jsf jsf-2 primefaces selectmanymenu