h:selectOneRadio映射到布尔值,将nulls转换为false

Cha*_*ncy 1 null jsf boolean jsf-2 selectoneradio

我有一个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> 
Run Code Online (Sandbox Code Playgroud)

支持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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

由于test没有默认值,单选按钮开始未选中.由于不需要该字段,我的期望是在没有选中单选按钮的情况下按下"保存"按钮会导致测试为空.相反,测试被指定为false.

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加到web.xml:

     <context-param>
         <param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name>
         <param-value>false</param-value>
     </context-param>
    
    Run Code Online (Sandbox Code Playgroud)

工作增加immediate="true"了什么h:commandButton.

我的问题:

  1. 是什么让h:selectOneRadio正常的转换为空?这是预期的行为吗?

  2. 为什么immediate="true"make h:commandButton不将null转换为false?immediate="true"在造成这种差异的特殊情况下,究竟做了什么?我理解immediate="true"将跳过JSF生命周期中的某些阶段,但我不明白这些阶段是什么导致从null转换为false.

编辑:

我才意识到我加immediate="true"的h:commandButton,不是的h:selectOneRadio.我的问题已经相应编辑.

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

Bal*_*usC 5

像原始包装的行为Boolean,Integer,Double,Character,等得到的原始的默认值false,0,0.0,\u0000分配,而不是等null是针对Apache EL,这是在AO的Tomcat,JBoss应用服务器和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中详细介绍.

也可以看看: