JSF 2.2 interpret empty string submitted values as

2019-06-19 06:07发布

I have migrated from Java EE 6 to Java EE 7, and now with JSF 2.2 the context param INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL seems not work. In JSF 2.1 I set it to "true" and it works perfectly, but now I get always blank strings.

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

Can anyone say something about it?

6条回答
小情绪 Triste *
2楼-- · 2019-06-19 06:37

Apache el implementation do the empty string (or 0 int value). You can find it in org.apache.el.parser.AstValue class:

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));            
    }
}

You can set COERCE_TO_ZERO to false (-Dorg.apache.el.parser.COERCE_TO_ZERO=false).

Or use other el impl:

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

And set context-param:

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

That was el-api side.

Other side is JSF. You have to set this context-param for JSF:

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

Sorry for my english!

查看更多
你好瞎i
3楼-- · 2019-06-19 06:37

There's a JVM property for the application server that helped me in a similar case. Please see Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1

查看更多
萌系小妹纸
5楼-- · 2019-06-19 06:41

I have tried below and got worked. we need to add this entry at web.xml

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>
查看更多
smile是对你的礼貌
6楼-- · 2019-06-19 06:47

Things are even more confusing now. I am using JSF 2.2.8-SNAPSHOT and although the value is interpreted as null during JSF bean validation, the actual value set is an empty String. This means that other components doing validation, e.g. JPA fail length validation as String value is "".

As this apparently requires a spec change, I wouldn't expect this any time soon. The jira also contains a workaround which is described in this post.

Ps. This could be the right behavior as the documentation states that null is passed to the bean validation framework, but this is not intuitive at all.

查看更多
等我变得足够好
7楼-- · 2019-06-19 06:50

The same happens with glassfish 4 with the latest Mojarra-2.2.5 as well as Wildfly 8 Final . . . I have seen multiple bug reports on this, Manfried Riem says "It was determined this is an EL issue and the EL implementation has been fixed to fix this", but not sure if that means Updating Mojarra fixes it, because it does not in glassfish 4. I also updated the el, and that did not work either.

查看更多
登录 后发表回答