2013-07-19 7 views
5

Hier ist meine SelectOneMenuselectonemenu JSF auf Objekte mit Konverter

<h:selectOneMenu value="#{bean.myObject}" > 
    <f:ajax render="componentToRender" listener="#{bean.onSelect}"/> 
    <f:converter converterId="myObjectConverter" /> 
    <f:selectItem itemLabel="None" itemValue="#{null}" /> 
    <f:selectItems value="#{bean.objects}" var="object" itemValue="#{object}" itemLabel="#{object.name}" /> 
</h:selectOneMenu> 

Und mein Konverter

@FacesConverter("myObjectConverter") 
public class MyObjectConverter implements Converter{ 

    private List<MyObject> objects; 

    public MyObjectConverter(){ 
     this.objects = MyController.getAllMyObjects(); 
    } 

    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     if(!StringUtils.isInteger(value)) { 
      return null; 
     } 
     return this.getMyObject(value); 
    } 

    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     if(value == null) { 
      return null; 
     } 
     return String.valueOf(((MyObject) value).getId()).toString(); 
    } 

    public MyObject getMyObject(String id) { 
     Iterator<MyObject > iterator = this.objects.iterator(); 
     while(iterator.hasNext()) { 
      MyObject object = iterator.next(); 

      if(object.getId() == Integer.valueOf(id).intValue()) { 
       return object; 
      } 
     } 
     return null; 
    } 

} 

Das Problem ist, dass meine Ajax Zuhörer nie genannt wird, und meine Komponente nie gemacht. Ist etwas falsch mit meinem Konverter oder selectOneMenu? Ich folge einem Beispiel und ich kann den Fehler nicht erkennen.

BTW: meine einfache Methode in der Bean

public void onSelect() { 
    System.out.println(this.myObject); 
    if(this.myObject != null) { 
     System.out.println(this.myObject.getName()); 
    } 
} 

Ich hatte schon ein Problem wie dieses, und ich meine ausgewählten Wert von Objekt zu id geändert. Aber hier möchte ich es mit Objekten arbeiten lassen, weil ich weiß, dass es möglich ist.

Dank

+0

Bitte fügen Sie '' oder '' und umfassen seine ID in '' als auch. Der Zufall ist groß, dass Sie schließlich die gewünschte Konvertierungsfehler-Nachricht erhalten. Oder schauen Sie einfach in Serverprotokollen nach eingereihten, aber nicht angezeigten Gesichtern Nachrichten. Oder vielleicht gibt es da sogar eine konkrete Ausnahme, die schon die ganze Antwort sein sollte, wie zum Beispiel 'NullPointerException', was auf ein eher triviales Java-Logikproblem hindeutet. – BalusC

+0

Ich kann hinzufügen, dass es die Listener-Methode eingibt, wenn ich das Element "none" in der Liste auswähle. –

+0

Ja, Sie haben Recht, ich habe einen Validierungsfehler (der Wert ist falsch). Das heißt, es ist mein Konverter? Es ist ein sehr einfacher Konverter, dachte ich. –

Antwort

7

Ich habe die Lösung. Ich musste die "equals" -Methode in der MyObject-Klasse überschreiben!

Danke.

EDIT: der Code

@Override 
public boolean equals(Object obj) { 
    if(this.id == ((MyObject) obj).id) { 
     return true; 
    }else { 
     return false; 
    } 
}