1

我有一个h:selectOneRadio已映射到Boolean支持 bean 中的(不是布尔值)的组件。加载时,单选按钮没有默认选择选项,单选按钮不是必填字段。

示例代码:

JSF 页面摘录:

<h:form>
<h:selectOneRadio value="#{pagecode.test}">
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/>
    <f:selectItem itemValue="#{false}" itemLabel="No"/>
</h:selectOneRadio>
<h:commandButton value="Save" action="#{pagecode.save}"/>
</h:form> 

支持 Java 页面代码:

package pagecode;

public class JSFBooleanTestView extends PageCodeBase {

    protected Boolean test;

    public Boolean getTest() {
        return test;
    }

    public void setTest(Boolean test) {
        this.test = test;
    } 

    public String save() {
        return "JSFBooleanTestView";
    }
}

faces-config.xml 摘录:

<managed-bean>
    <managed-bean-name>pagecode</managed-bean-name>
    <managed-bean-class>pagecode.JSFBooleanTestView</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

由于test未默认为值,因此单选按钮开始时未选中。由于该字段不是必需的,我的期望是在未选择单选按钮的情况下按下保存按钮会导致测试为空。相反,测试被分配为假。

我尝试过的不同选项没有效果:

  1. 环境h:selectOneRadio required="false"

  2. 添加到 web.xml:

    <context-param>
         <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
         <param-value>true</param-value>
     </context-param>
    
  3. 添加到 web.xml:

     <context-param>
         <param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name>
         <param-value>false</param-value>
     </context-param>
    

所做的工作是添加immediate="true"h:commandButton.

我的问题:

  1. 是什么使h:selectOneRadio通常将 null 转换为 false?这是预期的行为吗?

  2. 为什么immediate="true"makeh:commandButton不将空值转换为 false?在导致差异的这种特定情况下,究竟有immediate="true"什么不同?我知道这immediate="true"将跳过 JSF 生命周期中的某些阶段,但我不明白在这些阶段中是什么导致了从 null 到 false 的转换。

编辑:

我刚刚意识到我添加immediate="true"到了h:commandButton,而不是h:selectOneRadio. 我的问题已相应编辑。

这在使用 Apache MyFaces 2.0 的 IBM WebSphere Portal 8.0 上的 portlet 应用程序中使用。

4

1 回答 1

5

原始包装器(如Boolean, Integer, Double,Character等)获取原始默认值false, 0, 0.0,\u0000等的行为null是特定于 Apache EL 的,它用于 Tomcat、JBoss AS 和 WebSphere 服务器。它仅影响基于 EL 2.1 和 EL 2.2 的版本。自 EL 3.0 起,这种不当行为已得到纠正(在我自己的问题报告之后)。

使用org.apache.el.parser.COERCE_TO_ZERO确实是解决方案,但您应该将其设置为 VM 参数(系统属性),而不是上下文参数。对于这个特定问题,javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL是无关的,但您绝对应该保留它,以避免String使用空字符串而不是null.

博客文章The empty String madness详细介绍了所有这些以及一些历史。

也可以看看:

于 2016-03-25T08:57:14.310 回答