给定这个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,则列表中的任何值都不会等于它,因为EnumString进行了比较,导致选择了第一项。在这种情况下,如果#{fb.aktionTxt}String,则可以尝试使用<f:selectItems>

<f:selectItems value="#{myBean.FBAEnum}" var="myEnum" itemLabel="#{myEnum.toString()}" itemValue="#{myEnum.toString()}"/>

09-08 03:10