JSF 2.0 h:selectOneMenu mit enums

JanHH

Top Contributor
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
 
Du benutzt SelectItems und bastelst dir die getValues-Methode um:

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

Java:
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;
}
 
Zuletzt bearbeitet:
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.
 
oder du verwendest einen Converter (noch JSF 1.2 d.h. ValueBinding funzt aber auch mit JSF 2.0):


Java:
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();
	}
 
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..
 

Zurück
Oben