Как использовать автозаполнение Primefaces со списком POJO и свойством POJO в качестве значения выбора - PullRequest
3 голосов
/ 09 марта 2012

В нашем текущем проекте мы хотим заменить <h:selectOneMenu> на <p:autocomplete> Primefaces.Выбранные элементы - это список Pojos (объектов JPA).Разница с приведенными примерами в простых лицах витрины заключается в том, что мы хотим, чтобы свойство первичного ключа (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}": свойство 'name' не найдено для типа java.lang.Long '

Проблема в том, что атрибут var имеет тип Long, а не Player.При использовании простого <h:selectMenu> он работает в сочетании с <f:selectItems>:

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

Кто-нибудь знает, как решить эту проблему?

1 Ответ

2 голосов
/ 09 марта 2012

Вы можете добавить метод поддерживающего бина, который возвращает игрока, принадлежащего к текущему активному playerId, и установить это currentPlayer в качестве атрибута значения вашего поддерживающего бина:

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}">
...