# jsf SelectOneMenu: Bean als SelectItem Value



## puddah (25. Sep 2006)

Hallo,

ich habe ein Problem mit der JSF Komponente SelectOneMenu. Ich möchte, dass die Werte meiner SelectItems durch Beans dargestellt werden. Ich habe gelesen, dass man sich dafür einen eigenen Konverter schreiben muss, was ich getan habe. Hier erst einmal die Bean die ich benutze:

```
public class Employee implements Serializable{

	private int id;

	private String name;
	
	private String forename;
	
	public Employee(){
		super();
	}
	
	public Employee(String name, String forename) {
		super();
		this.forename = forename;
		this.name = name;
	}	

	public String getForename() {
		return forename;
	}

	public void setForename(String forename) {
		this.forename = forename;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}
	
	public String toString(){
		return id + "," +name + "," + forename;
	}

	public void setId(int id) {
		this.id = id;
	}
}
```

Der Konverter für die Bean:

```
public class EmployeeConverter implements Converter {

	public Object getAsObject(FacesContext ctx, UIComponent uiComponent, String value) {
		Employee emp = new Employee();
		emp.setId(Integer.valueOf(getProperty(value, "id")));
		emp.setForename(getProperty(value, "forename"));
		emp.setName(getProperty(value, "surname"));
		System.out.println("Converter-> Employee: " + emp);
		System.out.println("Converter-> value: " + value);
		return emp;
	}
	
	private String getProperty(String source, String propName){
		int idIndex = source.indexOf(propName + "=") + propName.length()+1;
		int commaIndex = source.indexOf(",",idIndex);
		if(commaIndex < 0) commaIndex = source.indexOf("]");
		System.out.println(idIndex);
		System.out.println(commaIndex);
		return source.substring(idIndex, commaIndex);
	}
	

	public String getAsString(FacesContext ctx, UIComponent uiComponent, Object value) {
		if(!(value instanceof Employee)) throw new ConverterException();
		Employee emp = (Employee)value;
		StringBuffer stringValue = new StringBuffer("[id=");
		stringValue.append(emp.getId());
		stringValue.append(",forename=");
		stringValue.append(emp.getForename());
		stringValue.append(",surname=");
		stringValue.append(emp.getName());
		stringValue.append("]");
		return stringValue.toString();
	}

}
```
Die Methode, in der ich mir die SelectItems zusammen baue:

```
public Collection<SelectItem> getPmList() {
		Collection<SelectItem> selectItems = new Vector<SelectItem>();
		Collection<Employee> emps = controler.getEmployeeService()
				.getEmployees();
		Iterator<Employee> iter = emps.iterator();
		while (iter.hasNext()) {
			Employee emp = iter.next();
			selectItems.add(new SelectItem(emp, emp.getName() + ", "
					+ emp.getForename()));
		}
		return selectItems;
	}
```
Und zu guter letzt der Teil der JSF mit dem SelectOneMenu:


```
<h:selectOneMenu id="pm" value="#{ProjectEditBean.project.projectManager}">
					<f:selectItems value="#{ProjectEditBean.pmList}" />
</h:selectOneMenu>
```
Auf der selben Seite habe ich noch ein h:message Feld, das mir bei jedem Submit folgende Fehlermeldung ausgibt:
*Validierungs-Fehler: Wert nicht gültig*
Hat jemand eine Ahnung woran das liegt? hab ich irgendetwas vergessen oder falsch gemacht?
Ich hab mir schon jede Menge Turoials im Netz angesehen, da wird aber meist nur die Verwendung von SelectOneMenus mit primitiven Datentypen beschrieben, nicht aber die Verwendung mit Beans.


----------



## HLX (25. Sep 2006)

puddah hat gesagt.:
			
		

> Und zu guter letzt der Teil der JSF mit dem SelectOneMenu:
> 
> 
> ```
> ...



...und zu allerletzt: wie wird #{ProjectEditBean.project.projectManager} gesetzt? Hier sollte eines deiner SelectItems also ein Employee drin stehen.


----------



## puddah (26. Sep 2006)

Muss das ein Objekt vom Typ SelectItem mit einer Employee Bean sein, oder direkt eine Employee Bean?


----------



## HLX (26. Sep 2006)

Ein Employee-Objekt - da du dieses als Value der SelectItems setzt.


----------



## puddah (26. Sep 2006)

Genau, das habe ich auch gemacht. Also kann es daran nicht liegen. Hmm... Kann es sein dass mit dem Converter etwas nicht stimmt?


----------



## HLX (26. Sep 2006)

Ich denke nicht. Habe allerdings für SelectItems noch nie einen Konverter verwendet. Kommt der überhaupt irgendwo zum Einsatz? Wo wird der Konverter angesprochen?

Du solltest es mal mit Strings versuchen. Erzeuge die SelectItems statt mit Employee-Objekten mit dessen id als String:


```
...
selectItems.add(new SelectItem(String.valueOf(emp.getId()), emp.getName() + ", " 
               + emp.getForename())); 
...
```

Dann liefere aus der Bean den Wert, der unter "value" des SelectOneMenus stehen ebenfalls als String. Setze dabei den Wert auf eine beliebige vorhandene Id.


----------

