【问题标题】:How to use Primefaces autocomplete with a POJO List and a POJO's property as selection value如何使用带有 POJO 列表和 POJO 属性作为选择值的 Primefaces 自动完成
【发布时间】:2012-03-27 01:46:52
【问题描述】:

在我们当前的项目中,我们希望将 <h:selectOneMenu> 替换为 Primefaces 的 <p:autocomplete>。选择的项目是 Pojos(JPA 实体)的列表。与 primefaces showcases 中给定示例的不同之处在于,我们希望实体的主键属性(id)作为选择值,因此可以轻松地将其作为视图参数传递:

<f:metadata>
    <f:viewParam name="playerId" value="#{playerPreRenderViewListener.searchCriteria.playerId}" />
    <f:viewParam name="year" value="#{playerPreRenderViewListener.searchCriteria.year}" />
</f:metadata>
<h:form>
    <h:inputText value="#{playerPreRenderViewListener.searchCriteria.year}"/>
    <p:autoComplete var="player" itemLabel="#{player.name}" itemValue="#{player.id}"
        completeMethod="#{playerBean.completePlayer}" forceSelection="true"
        converter="#{playerConverter}" 
        value="#{playerPreRenderViewListener.searchCriteria.playerId}">
    </p:autoComplete>
    <h:commandButton value="Submit" action="showTeam?faces-redirect=true&amp;includeViewParams=true" />
</h:form>

不幸的是,上面的示例将导致 PropertyNotFoundException:

itemLabel="#{player.name}":在 java.lang.Long 类型上找不到属性“名称”

问题在于var 属性的类型是Long 而不是Player。当使用简单的&lt;h:selectMenu&gt; 时,它与&lt;f:selectItems&gt; 一起使用:

<f:selectItems var="player" value="#{playerBean.listPlayers}" itemLabel="#{player.name}" itemValue="#{player.id}" />

有人知道如何处理这个问题吗?

【问题讨论】:

  • 你能提供你的播放器转换器的代码sn-p吗?我遇到了同样的问题,想为此使用转换器。

标签: jsf-2 autocomplete primefaces


【解决方案1】:

您可以添加一个支持 bean 方法,该方法返回属于当前活动的 playerId 的播放器,并将此 currentPlayer 设置为支持 bean 的值属性:

public Player getCurrentPlayer() {
  // find player by playerId and return
}

在视图中:

<p:autoComplete var="player" itemLabel="#{player.name}" itemValue="#{player}"
        completeMethod="#{playerBean.completePlayer}" forceSelection="true"
        converter="#{playerConverter}" 
        value="#{playerPreRenderViewListener.currentPlayer}">

【讨论】:

  • 谢谢,但这意味着有一个 getter 和 on setter 用于视图参数,另一个 getter 和 setter 用于自动完成。另外 - 在每个 preRenderView 上,您必须查找作为 viewparam 给出的 id 的播放器对象。有没有更简单的方法,就像我们使用 h:selectOneMenu 一样?
  • 在上面的例子中你的意思是itemValue="#{player}"我猜(没有id)?
  • 你可以在playerId的setter中设置currentPlayer。顺便说一句:你的 PlayerPreRenderViewListener 是什么?它是相位监听器吗?
  • 谢谢马特。问题是,在上面的代码中searchCriteria 只是一个简单的传输对象。本身无法查找玩家。在我们的用例中,玩家是从 db 中获取的。 PS:playerPreRenderViewListener 只是一个请求范围的支持 bean,用于在 PreRenderViewEvent 上进行初始化,也可以是 playerBean。
  • 能否提供playerConverter的sn-p代码
猜你喜欢
  • 2015-02-17
  • 2012-01-23
  • 1970-01-01
  • 2016-01-03
  • 2014-03-08
  • 2013-01-31
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多