h:selectOneRadio 正在传递空字符而不是空值

h:selectOneRadio is passing null character instead of null value

在我的 JSF 页面代码中,我有类似于以下内容的内容:

<h:selectOneRadio value="#{pagecode.attending}" required="true" id="attendingRadio" binding="#{attendingRadio}">
    <f:selectItem itemValue="Y" itemLabel="Yes"/>
    <f:selectItem itemValue="N" itemLabel="No"/>
    <f:ajax event="click" render="attendingDetails" execute="attendingRadio"/>
</h:selectOneRadio>
<h:panelGroup id="attendingDetails">
    <h:panelGroup rendered="#{pagecode.showForm(attendingRadio.value)}">
        ...
    </h:panelGroup>
</h:panelGroup>

在我的页面代码支持 bean 中,我有如下内容:

public class Pagecode {
    protected Character attending;

    public Character getAttending() {
        return attending;
    }

    public void setAttending(Character attending) {    
        this.attending=attending;
    }

    public boolean showForm(Character c) {
        if (c==null) {
            return false;
        }
        (other stuff)...
    }

}

我期望的行为是:

  1. 页面加载。单选按钮未定义初始值,因此既未选择 Yes 也未选择 No。但是,由于 required="true",如果用户将其留空(他们这样做),用户将收到验证错误。
  2. 第一次加载页面时,调用#{pagecode.showForm(attendingRadio.value)},我希望传递一个空对象,showForm 会 return false .

在进行了一些故障排除后,我确定实际发生的是传递的不是空对象,即等效的 showForm(null),而是我得到的是等效的 showForm(new Character('\u0000'));它传递空值的 Unicode 字符。

当我的 h:selectOneRadio 没有选择值时,有没有办法让 JSF 传递 Java 空对象而不是空字符?我在 WebSphere Portal 8.0 上使用 Apache MyFaces JSF 2.0。

作为旁注,我确实尝试将以下内容添加到我的 web.xml,不幸的是它没有帮助:

<context-param>
   <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
   <param-value>true</param-value>
</context-param>

Character/char 只是您要表示的值的错误数据类型。

改用 enum

public enum Choice {
    Y, N;
}

private Choice attending;

或者,可能更好,Boolean

private Boolean attending;

<f:selectItem itemValue="true" itemLabel="Yes" />
<f:selectItem itemValue="false" itemLabel="No" />