# SelectOneMenu liest Daten nicht ein



## Pahlkenberg (8. Nov 2011)

Ich habe ein SelectOneMenu, welches mir "Kunden" anzeigt, von denen dann der angewählte an eine Bean übergeben werden soll. Die Kunden werden korrekt nach meiner Vorgabe als SelectItems angezeigt mit Vor- und Nachname und als value dieser SelectItems ist jeweils auch korrekterweise ein Objekt der Klasse Customer enthalten, wie ich durch Debugging gesehen habe. Aber die Auswahl wird einfach nicht auf die Bean geschrieben.

Auf der jsf-Seite sieht es so aus:


```
<h:selectOneMenu id="pickCustomer" size="3" value="#{kontoListBean.customer}">
     <f:selectItems value="#{personListBean.customerItems}" />
 </h:selectOneMenu>
```

In der PersonListBean sieht es so aus:


```
public List<SelectItem> getCustomerItems() {
    List<SelectItem> customerItems = new ArrayList<SelectItem>();
    if (getPersonList() == null) {
      return customerItems;
    }
    for (Person listPerson : getPersonList()) {
      if (listPerson instanceof Customer) {
        customerItems.add(new SelectItem(listPerson, listPerson.getForename() + " " + listPerson.getSurname()));
      }
    }

    return customerItems;
  }
```


Wie gesagt funktioniert alles korrekt bis zu dem Moment, wo nach der Auswahl die Methode "setCustomer(...)" der KontoListBean aufgerufen wird. Da wird als Parameter dann "null" übergeben, statt dem ausgewählten Kunden. Was mache ich falsch?

Danke schonmal für die Hilfe!


----------



## Sym (8. Nov 2011)

Wie sieht denn Deine setCustomer aus?

Wie sieht Dein Button aus?


----------



## Pahlkenberg (8. Nov 2011)

Standardsetter:


```
public void setCustomer(final Customer customer) {
    this.customer = customer;
  }
[/Java]


Der Button navigiert nur ins nächste Menü, welches darauf angewiesen ist, dass der Customer bereits in die Bean geschrieben wurde

[code=Java]
 <h:commandButton id="accountForExistingCustomer" value="Konto erstellen" action="goNewKonto" />
```


----------



## Sym (8. Nov 2011)

Das sieht ganz vernünftig aus. Hast Du eine Form drumherum?


----------



## Pahlkenberg (8. Nov 2011)

Ja. Form ist auch drum herum. Könnte es vielleicht daran liegen, dass er ein Customer-Objekt erwartet aber stattdessen ein SelectItem bekommt und man den Value noch manuell in einer Methode rausziehen muss?


----------



## Pahlkenberg (8. Nov 2011)

Ok hab eine "Lösung" gefunden, die aber mehr schlecht als recht ist. Hab auf einem anderen Forum von einem Typen gelesen, der das gleiche Problem hatte, dass die set-Methode des OneList-Menüs einfach nichts durchgibt-außer man übergibt in dem SelectItem nicht (Objekt,String) sondern (String,String) und fängt dann eben in der Bean auch das Ergebnis auf einer String-Variablen auf. Dazu müsse man dann nur noch in der Bean definieren, wie man zu einem eindeutigen String wieder das passende Objekt aufruft.

Siehe da, das hat sofort geklappt bei mir, aber das ist doch voll sch***, dass man kein Objekt aus dem SelectItem übergeben kann. Ich dachte intuitiv, das wäre der eigentliche Sinn.

Falls jemand da noch einen echten Bugfix am Start hat, wäre ich dankbar. Aber wenigstens funktioniert es


----------



## JimPanse (8. Nov 2011)

Hi,

es ist aus Perfomance Gründen immer besser die SelectItems mit id + Bezeichner zu befühlen ABER
wenn du unbedingt Objekte verwenden willst dann brauchst du einen Converter:

The BalusC Code: Objects in h:selectOneMenu

Vergesse aber nicht in deinem Objekt die equals()-Methode zu überschreiben die wird intern aufgerufen.

Grüße


----------



## Pahlkenberg (9. Nov 2011)

Ok danke. Mit einem Converter klappts!


----------

