h:selectOneMenu带有布尔类型的选项,无法使用空值。

11

我正在使用JSF 2.0、JBoss 7.1.1 Final,并且我在使用selectOneMenu时遇到了以下问题。我想要能够将托管bean中的一个字段设置为true/false/null。因此,我创建了以下selectOneMenu:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="true" itemLabel="Yes"/>
    <f:selectItem itemValue="false" itemLabel="No"/>
</h:selectOneMenu>

现在,如果我选择“任何..”,它将把“false”分配给registrationComplete字段(布尔类型)。因此null被解释为false。我还尝试在selectItem(s)中使用布尔值,即:

 <h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/>
    <f:selectItem itemValue="#{false}" itemLabel="No"/>
</h:selectOneMenu>

我还在faces-config中注册了转换器,如下所示:

<converter>  
    <converter-id>booleanConverter</converter-id>  
    <converter-class>javax.faces.convert.BooleanConverter</converter-class>  
</converter>

然后尝试使用它:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="true" itemLabel="Yes"/>
    <f:selectItem itemValue="false" itemLabel="No"/>
        <f:converter converterId="booleanConverter"/>
</h:selectOneMenu>

但所有这些尝试都导致了相同的行为 - 当选择空值时,它被解释为假。

我进行了调试,并在堆栈跟踪中找到了发生此问题的位置。在AstValue.setValue(EvaluationContext, Object) line: 204中调用了该位置。

ELSupport.coerceToType(value, targetClass)

当value参数为null且targetClass为Boolean时,该coerceToType方法返回false。

有什么解决这个问题的想法吗?谢谢!


setRegistrationComplete()方法的签名是什么?参数的类型是什么?是Boolean还是boolean? - prageeth
@prageeth:OP明确说明了“布尔值”。 - BalusC
@prageeth 这是公共的void setRegistrationComplete(Boolean registrationComplete)。而且字段registrationComplete是Boolean类型的。 - lukas
1个回答

9

这是 Apache EL 解析器的典型特征,它被 Tomcat 和 JBoss 使用。在 EL 中强制使用 null 值时,它无法区分基元类型和其包装对象表示形式。包装类型总是被视为基元类型。例如,在 Glassfish 中工作正常。

您可以通过将以下 VM 参数添加到服务器启动脚本来关闭此 Apache EL 解析器行为:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接