p:la saisie semi-automatique itemLabel jette “La classe " java.lang.La chaîne " n'a pas la propriété 'label'.”
Je vais changer de IceFaces de PrimeFaces (je voulais vraiment changer de RichFaces mais à cause d'un bug dans la nouvelle version, je ne vais pas) et je suis havinng certains dificults à mettre en œuvre correctement primefaces de saisie semi-automatique. Selon le manuel, j'ai juste besoin de mettre en œuvre une méthode qui retourne une liste d'objets, et dans ce cas, un convertisseur est nécessaire.
La liste, je suis de retour est une liste de javax.des visages.de modèle.SelectItem, je ne comprends vraiment pas pourquoi j'ai besoin de créer un convertisseur de cela, mais permet de continuer. J'ai créé un convertisseur simple, il suffit de tester, mais primefaces ne reconnaît pas mon convertisseur et renvoie cette erreur dans le navigateur:
/ressources/composants/popups/popupBuscaPessoa.xhtml @35,41 itemLabel="#{pessoa.label}": La classe java.lang.La chaîne "n'a pas la propriété "étiquette".
C'est mon conversor de classe (juste pour tester):
public class ConversorSelectItem implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value!=null && value.isEmpty())
return null;
SelectItem selectItem=new SelectItem();
selectItem.setLabel(value);
return selectItem;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) {
return ((SelectItem)object).getLabel();
}
}
C'est là que j'ai essayer d'utiliser p:saisie semi-automatique:
<p:autoComplete value="#{modeloPopupBuscaPessoa.itemSelecionado}"
completeMethod="#{controladorSugestaoPessoa.atualizarSugestoes}"
var="pessoa" itemLabel="#{pessoa.label}" itemValue="#{pessoa.value}"
converter="#{conversorSelectItem}"/>
Ai-je fait quelque chose de mal? N'est-ce pas là un défaut convertisseur pour SelectItem? Est-il un moyen plus facile de mettre en œuvre ce convertisseur?
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas nourrir avec des
List<SelectItem>
. Vous devez le nourrir avec desList<Pessoa>
. Vous ne devriez pas se concentrer sur la conversion deSelectItem
. Vous devriez vous concentrer sur la conversion de la valeur de l'élément, qui estPessoa
. LeSelectItem
est un vestige de l'ancien JSF 1.x les âges. Dans JSF 2.x ce n'est pas obligatoire de plus, grâce à lavar
,itemValue
etitemLabel
attributs dans la vue. Cela permet de maintenir votre bean propre à partir de la vue spécifique de l'encombrement.La
Converter
n'est nécessaire que chaque fois que vous utilisezitemValue="#{pessoa}"
et la#{modeloPopupBuscaPessoa.itemSelecionado}
désigne unPessoa
de la propriété. Vous devez ensuite dansgetAsString()
convertirPessoa
à son uniqueString
représentation (de sorte qu'il peut être imprimé en HTML) et dansgetAsObject()
convertirString
àPessoa
(de sorte qu'il peut être mis sur le haricot de propriété).Toutefois, si
#{pessoa.value}
est unString
et#{modeloPopupBuscaPessoa.itemSelecionado}
est aussi unString
, alors vous devriez utiliseritemValue="#{pessoa.value}"
et retirer leConverter
tout à fait.Voir aussi:
<p:saisie semi-automatique>
avec POJOUn Convertisseur générique que vous pouvez utiliser pour Primefaces Auto-complète et toutes les autres fins:
Un plus facile d'atteindre cet objectif:
substitution de la toString() méthode de Pessoa classe Pojo.
Cette toString() ne devrait Étiquette de retour que vous souhaitez afficher.
Si vous utilisez cette méthode, puis il est PAS BESOIN de convertisseur.
Par exemple:
Ensuite, vous pouvez utiliser:
C'est la façon dont je l'utilise actuellement et qui fonctionne bien.
J'ai fait face à la même question, et l'auteur du commentaire à Primefaces de saisie semi-automatique avec POJO et de la Chaîne de valeur m'a donné l'astuce pour trouver la source du problème dans mon cas.
Aperçu
Le problème est que
value=#{objectValue}
est de typeString
mais la méthode référencée danscompleteMethod
est de retour uneList<Object>
.La Conception
J'ai le texte suivant Pojo (simplifié):
et
N'a pas d'importance si c'est utile. Je veux juste aborder la question.
Suivantes
p:autoComplete
(simplifié):va jeter
The class 'java.lang.String' does not have the property 'groupId'
. Lorsque je change deitemLabel=#{group}
, je vais voir le groupIdCG00255
dans le champ de saisie, mais beaucoup deorg.coadd.sharedresources.model.CollaboratorGroup@...
dans la liste déroulante. Si je sélectionne l'un de ces, cettetoString()
valeur est définie pour le Collaborateur.groupId qui n'est pas souhaité.Le Problème à la Source
Je me nourris de la
p:autoComplete
avec unList<CollaboratorGroup>
toutCollaborator.groupId
est unString
etitemLabel
est utilisé pour "format" à la fois, laString groupId
définir commevalue="#{collaborator.groupId}"
et laCollaboratorGroup
qui vient de laList
, généré parcompleteMethod="#{bean.completeGroup}"
.Solutions Possibles
Model
en changeant le membregroupId
àCollaboratorGroup
dansCollaborator
si elle ne détruit pas votre conception. Dans ce cas, surtout queCollaboratorGroup
a le membreCollaborator piUserId
.Vous pourriez vous suffit de remplir le
p:autoComplete
avecList<String> groupIdList
mais dans ce cas, vous devez trouver une autre solution pour leitemtip
.Une solution très rapide est d'utiliser
itemLabel="#{group.class.simpleName eq 'String' ? group : group.groupId}"
comme mentionné au Primefaces de saisie semi-automatique avec POJO et de la Chaîne de valeur.NullPointerExceptions
.View
avec la logique.Mettre en œuvre 3. dans une méthode d'haricot
itemLabel="#{bean.printGroupId(group)}"
où vous avez le plein contrôle sur la logique. C'est ce que j'ai fait.(Pas le meilleur, juste pour vous donner une idée.)