selectOneMenu没有显示正确的值,但getter获取它

时间:2014-11-24 16:24:38

标签: java jsf enums

鉴于此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对象。

2 个答案:

答案 0 :(得分:1)

正在选择

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()}"/>

答案 1 :(得分:0)

哦 - 我的 - 上帝

数据库值为|CURSOR_LEER |(20个字符),带有下划线,而我的枚举使用连字符。我怎么可能,我的同事或任何读这篇文章的人都没有看到这么久&gt;。&lt;