2017-05-31 1 views
1

J'utilise un pickList de PrimeFaces avec un convertisseur personnalisé.Les valeurs converties par le convertisseur personnalisé ne sont pas affichées

JSF:

<p:pickList converter="costsConverter" value="#{offerController.costsAsDualListModel}" var="cost" itemLabel="#{cost}" itemValue="#{cost}" /> 

offerController.costsAsDualListModel ressemble à ceci:

public DualListModel<Cost> getCostsAsDualListModel() { 
    DualListModel<Cost> costsDualList; 
    List<Cost> costsSource = new ArrayList<Cost>(); 
    List<Cost> costsTarget = new ArrayList<Cost>(); 
    for (Cost c : costs) { 
     costsSource.add(c); 
    } 
    costsDualList = new DualListModel<Cost>(costsSource, costsTarget); 
    return costsDualList; 
} 

Et mon convertisseur personnalisé ressemble à ceci:

public String getAsString(FacesContext context, UIComponent component, Object object) { 
    if (object == null) { 
     return ""; 
    } 
    Integer no = ((Cost) object).getNo(); 
    String valueOf = String.valueOf(no); 
    return valueOf; 
} 

getAsString() est appelé et valueOf est correct, mais dans mon liste de sélection je vois encore les objets et non la valeur de retour fo getAsString().

J'ai essayé d'utiliser <f:converter converterId="costsConverter"/> dans l'élément picklist. Même problème. Aussi je me suis inscrit le convertisseur faces-config.xml:

<converter> 
    <converter-id>costsConverter</converter-id> 
    <converter-class>com.my.converter.CostsConverter</converter-class> 
</converter> 

Quel pourrait être le problème?

+0

vous devez utiliser converterID avec l'attribut 'converter'. c'est la valeur de '' dans le fichier de configuration de l'application jsf (faces-config.xml) ou dans l'annotation '@ FacesConverter'. –

+0

Pour l'étiquette, un convertisseur n'est pas nécessaire (même pas utilisé). Utilisez juste '# {cost.no} là ... – Kukeltje

Répondre

2

Vous avez une mauvaise compréhension des valeurs dans les composants comme les listes de sélection, selectonemenus, etc. Ces valeurs ne sont jamais affichées mais les étiquettes sont. Et puisque les convertisseurs sont pour des valeurs, pas des étiquettes, vous ne verrez jamais la valeur convertie mais les étiquettes et tout se comporte comme il se doit. Il suffit d'utiliser itemLabel="#{cost.no}" et tout devrait bien se passer (affichage sage).

Voir par exemple. comment il est utilisé dans ces deux Q/A qui utilisent également un convertisseur

+0

Merci beaucoup pour la réponse! C'est comme ça que je l'utiliserais dans un 'selectonemenu' mais la valeur d'un' picklist' utilise un 'DualListModel <>' avec une source et un targer (qui sont les deux éléments 'Lists <>') au lieu d'un 'List <> '. Donc je ne sais pas comment accéder au "non". – antarkt1s