<p:selectManyMenu var> 抛出 ELException: class 'java.lang.String' 没有 属性 'foo'

<p:selectManyMenu var> throws ELException: The class 'java.lang.String' does not have the property 'foo'

我正尝试在高级模式下实现 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 ...> 时,它工作得很好。

这是由占位符项目引起的,该项目的值为空字符串。

<f:selectItem itemLabel="Select questions" itemValue="" />

最好明确地使其成为 #{null} 而不是空字符串,以便它解析为 null 而不是 java.lang.String

<f:selectItem itemLabel="Select questions" itemValue="#{null}" />

它在 <p:selectOneMenu> 中工作,因为它的渲染器只是在项目值为 instance of String 时渲染标签(如果它实际上是 null,这又会失败;这是反过来可能是 PrimeFaces 中的 oversight/bug。

另请参阅:

  • Best way to add a "nothing selected" option to a selectOneMenu in JSF