JSF 2.2将空字符串提交的值解释为null无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSF 2.2将空字符串提交的值解释为null无效相关的知识,希望对你有一定的参考价值。

我已经从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-2.2.5以及Wildfly 8 Final的glassfish 4也是如此。 。 。我已经看到了关于此的多个错误报告,Manfried Riem说“已经确定这是一个EL问题并且已经修复了EL实现以修复此问题”,但不确定这是否意味着更新Mojarra修复它,因为它不在glassfish中我也更新了el,但也没有用。

另一答案

不幸的是,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

另一答案

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>

并设置context-param:

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

那是el-api方面。

另一方面是JSF。你必须为JSF设置这个context-param:

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

对不起我的英语不好!

另一答案

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

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

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

另一答案

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

另一答案

我已经尝试过下面的工作了。我们需要在web.xml中添加此条目

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

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

将ORACLE中查询结果为空字符串的变成null该怎么做

如果地图中不存在属性,如何使用 strsubsitutor 将模板字符串中的值替换为 null 或空字符串

NULL是指() A、0 B、空格 C、未知的值或无任何值 D、空字符串

将空字符串转换为 null 的 Groovy 方法

统一修改表单参数(表单提交的空字符串统一转null)

当初始值为空字符串且新值为 null 时调用 valueChangeListener