# JSF 2.0 h:selectOneMenu mit enums



## JanHH (1. Jun 2011)

Hallo,

beim seam 2 gabs das nette s:selectItems mit dem Attribut "noSelectionLabel". Wenn eine Property einer Bean ein Enum ist, die Property allerdings null ist, dann wird dies mit dem als "noSelectionLabel" angegebenen String im Menüfeld angezeigt.

Jetzt hab ich JSF 2.0 und JEE 6 am Wickel, ohne seam 2, ohne s:selectItems, und nun stellt sich die Frage, wie man das dann realisiert. Man kann zwar bei f:selectItems ein "noSelectionValue" angeben, aber dies ist lediglich ein Element aus dem enum-Array, welches standardmässig angezeigt wird. Notfalls könne man einen Text wie "bitte auswählen" als erstes Element mit in das Enum aufnehmen, aber dann funktioniert das automatische Validieren mit @NotNull per beanValidation nicht mehr.

Dann könnte man statt h:selectOneMenu das rich:select von rich faces 4 nehmen, dies stellt, wenn eine enum-Property null ist, tatsächlich ein leeres Feld da. An sich völlig ok, aber für meine Anwendung auch nicht brauchbar, weil das javascript-onchange des Menüs, welches ich brauche, aufgrund irgendeines rf4-Bugs nicht zuverlässig funktioniert.

Also, was tun?

Gruß+Danke
Jan


----------



## F.S.WhiTeY (1. Jun 2011)

Du benutzt SelectItems und bastelst dir die getValues-Methode um:


```
<h:selectOneMenu id="name" value="#{enumBean.enums}" >
<f:selectItems value="#{enumBean.values}"/>
</h:selectOneMenu>
```

Dazu gehört eine getValues(); Methode die in etwa so aussieht:


```
public Object[] getValues(){
SelectItem[] items = new SelectItem[enums.values().length];

for ( int i = 0 ; i<items.length; i++){

//Hier null abfangen und nen Blankstring einhängen

items[i] = new SelectItem( enums.values()[i], enums.values()[i].toString().toLowerCase());

}
return items;
}
```


----------



## JanHH (1. Jun 2011)

Danke.. hat mich auf die richtige Spur gebracht ;-). Offenbar muss man zusätzlich zu den Enums ein weiteres SelectItem mit Wert null erzeugen, dann scheints zu gehen.


----------



## JimPanse (1. Jun 2011)

oder du verwendest einen Converter (noch JSF 1.2 d.h. ValueBinding funzt aber auch mit JSF 2.0):



```
public Object getAsObject(FacesContext aFacesContext,
			UIComponent aUIComponent, String aString) throws ConverterException {

		if (aString != null) {
			Class enumType = aUIComponent.getValueBinding("value")
					.getType(aFacesContext);

			return Enum.valueOf(enumType, aString);
		}

		return null;
	}
	public String getAsString(FacesContext aFacesContext,
			UIComponent aUIComponent, Object aObject) throws ConverterException {

		if (aObject == null) {
			return null;
		}
		Enum<?> type = (Enum<?>) aObject;

		return type.name();
	}
```


----------



## JanHH (2. Jun 2011)

Danke aber das Problem besteht nicht direkt darin, die Enums zu verwenden, sondern in der Anzeige eines Eintrages für Null-Werte (also nicht ein Element des Enum-Typs, sondern ein Text wie "bitte auswählen" oder so). Da gabs bei Seam 2 halt das schöne "noSelectionLabel" bei s:selectItems, aber das kriegt man ja "per Hand" in den Griff. Ist halt nur etwas mehr Arbeit..


----------

