2014-04-22 14 views
8

Ich verwende Primefaces 4.0 und JSF 2.2. Ich habe eine Auswahlliste mit einem Konverter verwendet. Das Problem ist, dass ich nicht den richtigen arg2 in meinem Konverter bekomme. Es sagt immer 0. Meine Erwartung ist, dass dies die ID des Elements ist und ich es aus den Quell-/Ziellisten auslesen kann. Irgendwelche Ideen?Primefaces Picklist Converter

Meine Converter ist inspiriert von How to write a custom converter for <p:pickList>.

Meine Auswahllisten-Erklärung ist wie folgt:

<p:pickList value="#{loadingPlaceGroups.pickList}" 
    style="margin:0" var="loadingPlace" 
    converter="primeFacesPickListConverter" 
    itemValue="#{loadingPlace}" 
    itemLabel="#{loadingPlace.name}#{loadingPlace.location.address.street}#{loadingPlace.location.address.houseNr}#{loadingPlace.location.address.zipCode}#{loadingPlace.location.address.city}" 
    showSourceFilter="true" showTargetFilter="true" 
    filterMatchMode="contains" 
    styleClass="picklist500x350source picklist500x350target"> 

    <f:facet name="sourceCaption">Alle Ladestellen</f:facet> 
    <f:facet name="targetCaption">Gewählte Ladestellen</f:facet> 
    <p:column style="border-bottom:1px solid lightgray"> 
     <p:panelGrid> 
      <p:row> 
       <p:column style="padding-left:0;font-size:12pt"> 
        <h:outputLabel value="#{loadingPlace.name}" 
         style="font-weight:bold" /> 
       </p:column> 
      </p:row> 
      <p:row> 
       <p:column style="padding:0"> 
        <h:outputLabel 
         value="#{loadingPlace.location.address.street} #{loadingPlace.location.address.houseNr}" /> 
       </p:column> 
      </p:row> 
      <p:row> 
       <p:column style="padding:0"> 
        <h:outputLabel 
         value="#{loadingPlace.location.address.zipCode} #{loadingPlace.location.address.city}" /> 
       </p:column> 
      </p:row> 
     </p:panelGrid> 
    </p:column> 
</p:pickList> 

Antwort

17

Für Auswahllisten Verwendung dieses generic converter:

import java.util.Map; 
import java.util.Map.Entry; 
import java.util.UUID; 
import java.util.WeakHashMap; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

@FacesConverter(value = "entityConverter") 
public class EntityConverter implements Converter { 

    private static Map<Object, String> entities = new WeakHashMap<Object, String>(); 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object entity) { 
     synchronized (entities) { 
      if (!entities.containsKey(entity)) { 
       String uuid = UUID.randomUUID().toString(); 
       entities.put(entity, uuid); 
       return uuid; 
      } else { 
       return entities.get(entity); 
      } 
     } 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) { 
     for (Entry<Object, String> entry : entities.entrySet()) { 
      if (entry.getValue().equals(uuid)) { 
       return entry.getKey(); 
      } 
     } 
     return null; 
    } 

}