【问题标题】:<p:selectManyMenu var> throws ELException: The class 'java.lang.String' does not have the property 'foo'<p:selectManyMenu var> 抛出 ELException:类 'java.lang.String' 没有属性 'foo'
【发布时间】: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'&lt;column ...&gt; 时,它可以正常工作。

【问题讨论】:

  • containerResultBean.selectedParamsListlist 对象吗?似乎pa 被当作一个字符串对象。
  • @Miguel 是的, selectedParamsList 是一个列表对象。 private List&lt;Param&gt; selectedParamsList = new ArrayList&lt;&gt;();
  • @Miguel 我不明白为什么它在 ManyMenu 而不是 OneMenu 中被视为 String 对象?
  • @Miguel 谢谢,但是 Omnifaces 转换器正在使用该类的 toString 方法,并且类似于他自己实现的方法。 Converter 只是将 Entity 对象转换为 String 并从 String 转换回 Entity。因此,如果转换器出现问题,OneMenu 也不应该工作。这就是我对转换器的理解..
  • 此外,转换器仅适用于&lt;f:selectItem(s)&gt;,不适用于自定义表示。

标签: jsf jsf-2 primefaces selectmanymenu


【解决方案1】:

这是由于占位符项的值为空字符串。

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

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

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

它在&lt;p:selectOneMenu&gt; 中工作,因为它的渲染器只是在项目值为instance of String 时渲染标签(如果它实际上是null,这反过来会失败;这又可能是一个疏忽/错误PrimeFaces)。

另见:

【讨论】:

  • 感谢它的工作,但为什么 中的空字符串会导致 ManyMenu 出现问题,而不是 OneMenu?
  • 我只是查看了它的源代码并更新了答案。
  • 知道为什么它在 OneMenu 中工作了..但是如果它的 null 会失败,你的意思是什么?什么是空?
  • &lt;p:selectOneMenu&gt; 如果您在其中使用了itemValue="#{null}",则会显示一个空的自定义项。
猜你喜欢
  • 2011-12-01
  • 2016-09-22
  • 2011-11-11
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多