10

我正在使用 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>

现在,如果我选择“Any..”,它会将“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>

But all these attempts resulted in the same behavior -- when the null value was selected, it was interpreted as false.

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

它调用

ELSupport.coerceToType(value, targetClass)

value 参数为 null,targetClass 为布尔值。然后这个 coerceToType 方法返回 false。

任何想法如何解决这个问题?谢谢!

4

1 回答 1

9

这是 Tomcat 和 JBoss 使用的 Apache EL 解析器的典型特征。null众所周知,在 EL 中强制值时不区分基元及其包装对象表示。包装器类型始终被视为原语。例如,它在 Glassfish 中运行良好。

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

-Dorg.apache.el.parser.COERCE_TO_ZERO=false
于 2012-07-26T16:21:17.873 回答