2013-07-19 9 views
5

Oto moja SelectOneMenuselectonemenu JSF na obiektach z konwerterem

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

A mój konwerter

@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; 
    } 

} 

Problemem jest to, że moja ajax słuchacz nigdy nie jest wywoływana i mój komponent nigdy renderowane. Czy coś jest nie tak z moim konwerterem lub selectOneMenu? Podążam za przykładem i nie mogę wymyślić błędu.

BTW: moja prosta metoda w fasoli

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

miałem już problem takiego i zmieniłem wybraną wartość od obiektu do id. Ale tutaj chcę, aby działało z obiektami, ponieważ wiem, że to możliwe.

Dzięki

+0

proszę dodać '' lub '' i zawierać jego identyfikator w '', jak również. Szansa jest duża, że ​​nareszcie otrzymasz wiadomość o pożądanym napędzie konwersji. Lub poszukaj w dziennikach serwera wiadomości z kolejnymi, ale niewyświetlanymi twarzami. A może jest tam nawet konkretny wyjątek, który powinien już być całą odpowiedzią na własną rękę, na przykład 'NullPointerException', który wskazuje na dość banalny problem logiki Java. – BalusC

+0

Mogę dodać, że wchodzi on do metody detektora, gdy wybieram pozycję "brak" na liście. –

+0

Tak, masz rację, mam błąd sprawdzania poprawności (wartość jest niepoprawna). To znaczy, że to mój konwerter? To bardzo prosty konwerter, pomyślałem. –

Odpowiedz

7

Mam rozwiązanie. Musiałem nadpisać metodę "równa się" w klasie MyObject!

Dzięki.

EDIT: kod

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