繁体   English   中英

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

[英]javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL does not work anymore since Java EE 7 / EL 3.0

<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) ,我已经看到多个关于此的错误报告,

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

修复版本说是 2.2.5,在 2.2.5 的发行说明中也有说明,我是不是遗漏了什么?

使用自定义解析器修复:

面孔-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;
    }
}

曼弗里德·里姆( Manfried Riem) ,我已经看到多个关于此的错误报告,

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

修复版本说是 2.2.5,在 2.2.5 的发行说明中也有说明,我是不是遗漏了什么?

实际的修复是在 EL 中,而不是在 JSF 中。 问题报告中提到的 Mojarra 版本只是“偶然地”当时最新的 Mojarra 版本。 另请参阅空字符串疯狂

基本上,要解决这个问题,您需要升级 EL 实现(或者只是升级整个服务器,因为它是实际提供开箱即用 EL 的服务器)。 对于 Oracle/Sun EL,该修复程序在3.0.1 b05 版本中,该版本自 2014 年 7 月 7 日起可用(只需选择最新版本)。 您可以将 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,请使用org.apache.myfaces.EXPRESSION_FACTORY <param-name>

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

示例代码 obj 条件检查是错误的。 在更新模型阶段,obj 以空值传递。 更正下面的代码后,我的自定义 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;
}

应用程序服务器有一个 JVM 参数对我有帮助。 请参阅解决 Mojarra JSF 2.1 中错误的 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL

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

结果是一样的。 String MethodExpression null 被解释为 EMPTY String ""

使用 t=null 从 EL 调用以下方法;

情况1

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

案例二

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)

案例四

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM