自Java EE 7 / EL 3.0起,javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL不再起作用

时间:2014-02-19 12:07:35

标签: jsf el jsf-2.2 java-ee-7

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

对于glassfish 4和wildfly 8 Final

,最新的Mojarra 2.2.5不起作用

我已经看过多个关于此的错误报告,Manfried Riem says

  

确定这是一个EL问题并且EL实现了   已修复以解决此问题

修复版本说2.2.5,它也在2.2.5的发行说明中说明,我错过了什么?

5 个答案:

答案 0 :(得分:11)

使用自定义解析器修复:

faces-config.xml中:

<application>
     <el-resolver>my.package.EmptyNullStringResolver</el-resolver>
</application>

EmptyNullStringResolver.java:

/**
 * @author pg
 */
public class EmptyNullStringResolver extends ELResolver {

    @Override
    public Class<?> getCommonPropertyType(ELContext context, Object base) {
        return String.class;
    }

    @Override
    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
        return null;
    }

    @Override
    public Class<?> getType(ELContext context, Object base, Object property) {
        return null;
    }

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        return null;
    }

    @Override
    public boolean isReadOnly(ELContext context, Object base, Object property) {
        return true;
    }

    @Override
    public void setValue(ELContext context, Object base, Object property, Object value) {
    }

    @Override
    public Object convertToType(ELContext context, Object obj, Class<?> targetType) {
        if (String.class.equals(targetType) && obj instanceof String && ((String) obj).trim().isEmpty()) {
            context.setPropertyResolved(true);
        }
        return null;
    }
}

答案 1 :(得分:5)

  

我已经看过多个关于此的错误报告,Manfried Riem says

     
    

确定这是一个EL问题,修复了EL实现以修复此问题

  
     

修复版本说2.2.5,它也在2.2.5的发行说明中说明,我错过了什么?

实际修复是在EL中,而不是在JSF中。问题报告中提到的Mojarra版本只是简单地#34;那一刻最新的Mojarra版本。另请参阅The empty String madness

基本上,要解决这个问题,你需要升级EL实现(或者只是整个服务器,因为它实际上提供EL开箱即用)。对于Oracle / Sun EL,修复程序位于version 3.0.1 b05,自2014年7月7日起可用(只需选择newest一个)。您可以将JAR放在/WEB-INF/lib中,如果需要,可以将以下配置添加到web.xml,以防您的服务器附带不同于Oracle / Sun EL的EL实现,这也暴露了相同的错误:

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>   
</context-param>

或者您可以安装其他EL实施,例如JUEL

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>de.odysseus.el.ExpressionFactoryImpl</param-value>   
</context-param>

如果您使用的是MyFaces而不是Mojarra,请使用<param-name>的{​​{1}}。

至于升级服务器,带有修复程序的EL版本至少存在于GlassFish 4.1和WildFly 8.2中。

答案 2 :(得分:1)

示例代码obj条件检查错误。在更新模型阶段,obj以null传递。在更正下面的代码后,我的自定义ELResolver可以工作。

 @Override
public Object convertToType(final ELContext context, final Object obj, final Class<?> targetType) {
    if (obj == null && String.class.equals(targetType)) {
        context.setPropertyResolved(true);
    }
    return null;
}

答案 3 :(得分:0)

有一个帮助我的应用程序服务器的JVM参数。 见Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1

答案 4 :(得分:0)

我们测试了所有Oracle EL 2.2.2,3.0.0,3.0.1-b0X [1-8]和Tomcat 7.0.xx或Tomcat 8.0.30中的Apache Jasper EL 3.0,使用或不使用ELResolver自定义ELResolver Wrapper修复了@ faces-config.xml级别。

结果是一样的。 String MethodExpression null被解释为EMPTY String&#34;&#34;

使用t = null;

从EL调用以下方法

案例1

public final void checkObject(Object t) 
...
#{myBean.checkObject(null)} -> Receive null (OK)

案例2

public final void checkString(String t) 
...
#{myBean.checkString(null)} -> Receive EMPTY String "" (NOT OK)

案例3

public final void checkDouble(double t) 
...
#{myBean.checkDouble(null)} -> Receive 0.0 (OK)

案例4

public final void checkBigDecimal(BigDecimal t) 
...
#{myBean.checkBigDecimal(null)} -> Receive null (OK)