JSF 2.2 将提交的空字符串值解释为 null 不起作用

Posted

技术标签:

【中文标题】JSF 2.2 将提交的空字符串值解释为 null 不起作用【英文标题】:JSF 2.2 interpret empty string submitted values as null not working 【发布时间】:2013-11-03 17:05:51 【问题描述】:

我已经从 Java EE 6 迁移到 Java EE 7,现在使用 JSF 2.2,上下文参数 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 似乎不起作用。在 JSF 2.1 中,我将其设置为“true”并且它运行良好,但现在我总是得到空白字符串。

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

谁能说一说?

【问题讨论】:

可能是实现中的错误。能否调试环境以确认是否是 mojarra 源中的错误? javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL does not work anymore since Java EE 7 / EL 3.0 的可能重复项 【参考方案1】:

带有最新 Mojarra-2.2.5 的 glassfish 4 也是如此 以及 Wildfly 8 Final 。 . .我已经看到了多个关于此的错误报告,Manfried Riem 说“已确定这是一个 EL 问题,并且已修复 EL 实现以解决此问题”,但不确定这是否意味着更新 Mojarra 可以修复它,因为它不在 glassfish 4. 我也更新了el,还是不行。

【讨论】:

【参考方案2】:

不幸的是,Glassfish 4 中似乎存在一个错误。

见:

INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL doesn't work at all

和:

Empty String as Null is not effective in 2.2.0

【讨论】:

【参考方案3】:

Apache el 实现执行空字符串(或 0 int 值)。你可以在 org.apache.el.parser.AstValue 类中找到它:

public void setValue(EvaluationContext ctx, Object value)
        throws ELException 
    Target t = getTarget(ctx);
    ctx.setPropertyResolved(false);
    ELResolver resolver = ctx.getELResolver();

    // coerce to the expected type
    Class<?> targetClass = resolver.getType(ctx, t.base, t.property);
    if (COERCE_TO_ZERO == true
            || !isAssignable(value, targetClass)) 
        resolver.setValue(ctx, t.base, t.property,
                ELSupport.coerceToType(value, targetClass));
     else 
        resolver.setValue(ctx, t.base, t.property, value);
    
    if (!ctx.isPropertyResolved()) 
        throw new PropertyNotFoundException(MessageFactory.get(
                "error.resolver.unhandled", t.base, t.property));            
    

您可以将 COERCE_TO_ZERO 设置为 false (-Dorg.apache.el.parser.COERCE_TO_ZERO=false)。

或者使用其他的el impl:

    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>      
    </dependency>

并设置上下文参数:

    servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl");

那是 el-api 方面。

另一边是JSF。您必须为 JSF 设置此上下文参数:

servletContext.setInitParameter("javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", "true");

对不起我的英语!

【讨论】:

【参考方案4】:

现在情况更加混乱。 我正在使用 JSF 2.2.8-SNAPSHOT,虽然在 JSF bean 验证期间该值被解释为 null,但实际值集是一个空字符串。这意味着其他组件进行验证,例如JPA 长度验证失败,因为字符串值为“”。

因为这显然需要spec change,所以我不会很快想到这个。 jira 还包含此post 中描述的解决方法。

附言。这可能是正确的行为,因为 documentation 声明 null 已传递给 bean 验证框架,但这根本不直观。

【讨论】:

【参考方案5】:

应用程序服务器的 JVM 属性在类似情况下帮助了我。请看Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1

【讨论】:

【参考方案6】:

我在下面尝试过并且得到了工作。我们需要在 web.xml 中添加这个条目

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

【讨论】:

以上是关于JSF 2.2 将提交的空字符串值解释为 null 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WebApi jsonFormatter如何将空字符串值更改为空字符串

JSF 2.2 多部分表单未提交[重复]

使用 Json 反序列化在 Java 中自动将空字符串转换为 null

将带有 HTML 代码的字符串注入和解释到 JSF 页面的组件

Django ORM、CharField 和空白=True

Django ORM、CharField 和空白=True