2014-11-24 77 views
0

鉴于这种selectOneMenu用于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) 

为什么它在我的selectOneMenu中显示NEK0-NEK0(枚举的第一个元素)而不是CURSOR_LEER,当getter返回|CURSOR_LEER |?我调试了jsf页面,发现没有<option>具有selected属性。

奇怪的是,我可以使用相同的jsf代码创建一个新元素,它会将我的新对象正确保存到数据库中。我很确定这里没有办法使用trim(),因为此后我无法保存我的fb对象。

回答

0

噢 - 我 - 神

数据库值|CURSOR_LEER |(20个字符)与强调,而我的枚举使用连字符。我,我的同事或任何读这篇文章的人怎么也看不到这么久>。 <

+0

之内的空间这样的错误难以发现,特别是如果还有其他几个更明显的嫌疑人:) – 2014-11-27 11:12:40

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

由于数据库将只包含那些有效的“字符串”,因此不需要缺省值。您的解决方案对我来说似乎很合理,但不起作用;同样的效果:(btw,aktionTxt是一个java.lang.String – dasLort 2014-11-24 16:59:27

+0

@dasLort你可以将它设置为标签,只是为了检查值是否传递正确'itemLabel =“#{myEnum.toString()} ==#{fb。 aktionTxt}“'?另外,检查客户端和服务器日志,看看是否有什么相关的东西 – 2014-11-24 17:42:56

+0

抱歉没有响应,生病了。当我在标签的末尾添加一个'Q'时,输出将是'NEK0-NEK0 == CURSOR_LEER Q'。我想,有一些自动修正在这里 – dasLort 2014-11-27 09:56:06