在我们当前的项目中,我们想要替换一个 <h:selectOneMenu>
与 Primefaces 的 <p:autocomplete>
.选择的项目是 Pojos(JPA 实体)的列表。与 primefaces 中给定示例的区别 showcases也就是说,我们希望实体的主键属性 (id) 作为选择值,因此它可以很容易地作为 View 参数传递:
<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&includeViewParams=true" />
</h:form>
不幸的是,上面的示例将导致 PropertyNotFoundException:
itemLabel="#{player.name}": Property 'name' not found on type java.lang.Long'
问题是 var
属性的类型为 Long
而不是 Player
.使用简单的 <h:selectMenu>
时它与 <f:selectItems>
结合使用:
<f:selectItems var="player" value="#{playerBean.listPlayers}" itemLabel="#{player.name}" itemValue="#{player.id}" />
有人知道如何处理这个问题吗?
最佳答案
您可以添加一个返回属于当前事件 playerId
的玩家的辅助 bean 方法,并将此 currentPlayer
设置为您的辅助 bean 的值属性:
public Player getCurrentPlayer() {
// find player by playerId and return
}
在 View 中:
<p:autoComplete var="player" itemLabel="#{player.name}" itemValue="#{player}"
completeMethod="#{playerBean.completePlayer}" forceSelection="true"
converter="#{playerConverter}"
value="#{playerPreRenderViewListener.currentPlayer}">
关于jsf-2 - 如何将 Primefaces 自动完成与 POJO 列表和 POJO 的属性用作选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9636942/