selectonemenu jsf su oggetti con il convertitore

Qui è il mio SelectOneMenu

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

E mio convertitore

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

}

Il problema è che il mio ajax ascoltatore non viene mai chiamato e il mio componente mai reso.
C’è qualcosa di sbagliato con il mio convertitore o selectOneMenu? Seguo un esempio e io non riesco a capire l’errore.

BTW : il mio semplice metodo del bean

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

Ho già avuto un problema simile e ho cambiato il mio valore selezionato da oggetto, id. Ma qui voglio fare il lavoro con gli oggetti, perché so che è possibile.

Grazie

Si prega di aggiungere <h:message> o <h:messages> e sono il suo ID in <f:ajax render>. Il caso è di grande che potrete finalmente ottenere il desiderato errore di conversione facce messaggio. O, basta guardare nei log del server per accodato ma nascosta facce messaggi. O forse c’è anche un concreto eccezione in cui vi dovrebbe essere già tutta la risposta al suo, come NullPointerException che indica piuttosto banale Java problema di logica.
Posso aggiungere che è di entrare l’ascoltatore metodo quando si seleziona “nessuno” voce nell’elenco.
Sì, hai ragione, ho un errore di validazione (il valore non è corretto). Che dire, è il mio converter? Un semplice convertitore, ho pensato.
Questa domanda duplica Errore di Convalida: Valore non valido

OriginaleL’autore Loric- | 2013-07-19

1 risposta

  1. 7

    Ho la soluzione. Ho dovuto ignorare “è uguale a” metodo nella classe di MyObject!

    Grazie.

    EDIT: il codice

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

    OriginaleL’autore

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *