h:绑定到String属性的inputText是提交空字符串而不是null

Thr*_*ark 20 string null jsf tomcat el

我在Tomcat上有一个JSF 2.0应用程序,有很多<h:inputText>字段可以在我的数据库中输入数据.某些字段不是必需的.

<h:inputText value="#{registerBean.user.phoneNumber}" id="phoneNumber">
    <f:validateLength maximum="20" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)

当用户将此字段留空时,JSF设置空字符串""而不是null.

如何在不检查每个String的情况下修复此行为

if (string.equals("")) { string = null; }
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 49

您可以配置JSF 2.x中通过以下解释空提交的值作为空context-paramweb.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)

对于参考和感兴趣的人,在JSF 1.2中(因此不是1.1或更旧,因为它的设计不可能有Converterfor java.lang.String),这可以解决以下问题Converter:

public class EmptyToNullStringConverter implements Converter {

    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
        if (submittedValue == null || submittedValue.isEmpty()) {
            if (component instanceof EditableValueHolder) {
                ((EditableValueHolder) component).setSubmittedValue(null);
            }

            return null;
        }

        return submittedValue;
    }

    public String getAsString(FacesContext facesContext, UIComponent component, Object modelValue) {
        return (modelValue == null) ? "" : modelValue.toString();
    }

}
Run Code Online (Sandbox Code Playgroud)

......需要注册faces-config.xml如下:

<converter>
    <converter-for-class>java.lang.String</converter-for-class>
    <converter-class>com.example.EmptyToNullStringConverter</converter-class>
</converter>
Run Code Online (Sandbox Code Playgroud)

如果您还没有使用Java 6,请替换submittedValue.empty()submittedValue.length() == 0.

也可以看看

  • @James:所以你使用的是Tomcat(或者是在封面下使用Tomcat的JBoss或Websphere)?如果为true,则添加VM参数`-Dorg.apache.el.parser.COERCE_TO_ZERO = false`.另见http://stackoverflow.com/questions/3116517 (4认同)