2012-03-09 2 views
3

Dans notre projet actuel, nous voulons remplacer un <h:selectOneMenu> par <p:autocomplete> de Primefaces. Les éléments sélectionnés sont une liste de Pojos (Entités JPA). La différence des exemples donnés dans primefaces showcases est que nous voulons que la propriété clé primaire (id) de l'entité en tant que valeur de sélection, de sorte qu'il peut être facilement passé en vue param:Comment utiliser Primefaces autocomplete avec une liste POJO et la propriété d'un POJO comme valeur de sélection

<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> 

Malheureusement l'exemple ci-dessus conduira à une PropertyNotFoundException:

itemLabel = "# {player.name}": 'nom' propriété introuvable sur le type java.lang.Long »

Le p roblem est que l'attribut var est de type Long et non Player. Lors de l'utilisation d'un simple <h:selectMenu> cela fonctionne conjointement avec <f:selectItems>:

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

Quelqu'un sait comment gérer ce problème?

+0

Pouvez-vous fournir un extrait de code de votre convertisseur de lecteur, s'il vous plaît? J'ai rencontré le même problème et je veux utiliser un convertisseur pour cela. – CSchulz

Répondre

2

Vous pouvez ajouter une méthode de backing bean qui retourne le joueur appartenant à la playerId active et définir cette currentPlayer comme attribut de valeur de votre backing bean:

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

Et dans la vue:

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

thx, mais cela signifierait avoir un getter et un setter pour les params de vue, et un autre getter et setter pour la saisie semi-automatique. Plus - sur chaque preRenderView vous devez rechercher l'objet joueur pour l'identifiant donné comme viewparam. Y a-t-il un moyen plus simple, comme nous l'avons fait avec h: selectOneMenu? – fischermatte

+0

dans l'exemple ci-dessus, vous voulez dire 'itemValue =" # {player} "' je suppose (sans ID)? – fischermatte

+0

Oui, mon erreur, je l'ai corrigé. –