【问题标题】:javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL does not work anymore since Java EE 7 / EL 3.0javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 自 Java EE 7 / EL 3.0 起不再起作用
【发布时间】:2014-03-19 18:08:15
【问题描述】:
<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 的发行说明中也有说明,我是不是遗漏了什么?

【问题讨论】:

  • 仅作记录:WildFly 8.1 仍然存在这个问题。
  • Wildfly 8.2 似乎在工作

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


【解决方案1】:

使用自定义解析器修复:

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

【讨论】:

  • 使用最新的 glassfish 4.0.1 仍然损坏
  • Balus C 的 convertToType 函数略有不同 (balusc.omnifaces.org/2015/10/the-empty-string-madness.html) public Object convertToType(ELContext context, Object value, Class> targetType) { if (value == null && targetType == String.class) { context.setPropertyResolved(true); } 返回值; }
【解决方案2】:

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

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

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

实际的修复是在 EL 中,而不是在 JSF 中。问题报告中提到的 Mojarra 版本只是当时“巧合”的最新 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,请使用 &lt;param-name&gt;org.apache.myfaces.EXPRESSION_FACTORY

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

【讨论】:

  • 嗨 BalusC,这对我不起作用。我正在使用 Tomcat 8.0.28 和 Maven 下载 org.glassfishjavax.el3.0.1-b05编译 仍然无法正常工作。我像您一样配置了 web.xml,但无法正常工作。如果你能测试并帮助我解决这个问题,我真的很感激。
  • @Diego:它必须在运行时类路径中结束。
  • 我将依赖范围改为运行时,但还是不行。
  • 我找到了解决方案(在 tomcat 8 上测试)。显示的配置仍然不完整。为了在没有任何“解决方法”的情况下正常工作,除了响应在 web.xml 上放置上下文参数时已经显示的内容之外,还需要:“javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_‌​A‌​ S_NULLtrue"。现在,它就像一个魅力。
  • @Diego:是的,答案的重点是让上下文参数起作用。另请参阅问题。
【解决方案3】:

示例代码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;
}

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我们测试了所有 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 ""

      使用 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) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 2014-01-31
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        相关资源
        最近更新 更多