给定这个selectOneMenu
<h:selectOneMenu value="#{fb.aktionTxt}">
<f:selectItems value="#{myBean.FBAEnum}" />
</h:selectOneMenu>
这个bean代码
public FehlerBewertungAktionEnum[] getFBAEnum() {
return FehlerBewertungAktionEnum.values();
}
这个枚举
public enum FehlerBewertungAktionEnum {
NEKO_NEKO("NEK0-NEK0 "),
CURSOR_PARAMETER("CURSOR-PARAMETER "),
CURSOR_LEER("CURSOR-LEER ");
private final String str;
FehlerBewertungAktionEnum(String str) { this.str = str;}
public String toString(){ return str; }
}
和数据库值aktionTxt
|CURSOR_LEER | (20 chars)
当getter返回
|CURSOR_LEER |
时,为什么在我的selectOneMenu中显示NEK0-NEK0(枚举的第一个元素)而不是CURSOR_LEER?我调试了jsf页面,发现没有<option>
具有selected
属性。奇怪的是,我可以用相同的jsf代码创建一个新元素,并将新对象正确保存到数据库中。我很确定没有办法在这里使用
trim()
,因为那时我无法保存我的fb
对象。 最佳答案
选择NEK0-NEK0
是因为它是列表中的第一个,并且没有任何项目可以通过值与#{fb.aktionTxt}
匹配。您可以添加一个默认项,在这种情况下将被选中。
<h:selectOneMenu value="#{fb.aktionTxt}">
<f:selectItem itemLabel="Select one..."/>
<f:selectItems value="#{myBean.FBAEnum}" />
</h:selectOneMenu>
如果
#{fb.aktionTxt}
解析为(类型)为FehlerBewertungAktionEnum
,则它应该可以工作。但是,如果它是String
,则列表中的任何值都不会等于它,因为Enum
与String
进行了比较,导致选择了第一项。在这种情况下,如果#{fb.aktionTxt}
是String
,则可以尝试使用<f:selectItems>
<f:selectItems value="#{myBean.FBAEnum}" var="myEnum" itemLabel="#{myEnum.toString()}" itemValue="#{myEnum.toString()}"/>