Jsf javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL自JavaEE7/EL3.0以来不再工作 javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL 真的

Jsf javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL自JavaEE7/EL3.0以来不再工作 javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL 真的,jsf,el,jsf-2.2,java-ee-7,Jsf,El,Jsf 2.2,Java Ee 7,不适用于glassfish 4和wildfly 8决赛中最新的Mojarra 2.2.5 我看过很多关于这个的错误报告Manfried Riem 已确定这是一个EL问题,EL实施已完成 我已经修好了 修复版本是2.2.5,在2.2.5的发行说明中也有说明,我是否遗漏了什么?使用自定义解析器修复: faces-config.xml: <context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBM

不适用于glassfish 4和wildfly 8决赛中最新的Mojarra 2.2.5

我看过很多关于这个的错误报告Manfried Riem

已确定这是一个EL问题,EL实施已完成 我已经修好了


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

使用自定义解析器修复:

faces-config.xml:

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

my.package.EmptyNullStringResolver
EmptyNullStringResolver.java:

<application>
     <el-resolver>my.package.EmptyNullStringResolver</el-resolver>
</application>
/**
*@author pg
*/
公共类EmptyNullStringResolver扩展了ELResolver{
@凌驾
公共类getCommonPropertyType(ELContext上下文,对象库){
返回字符串.class;
}
@凌驾
公共迭代器GetFeatureDescriptor(ELContext上下文,对象库){
返回null;
}
@凌驾
公共类getType(ELContext上下文、对象基、对象属性){
返回null;
}
@凌驾
公共对象getValue(ELContext上下文、对象基、对象属性){
返回null;
}
@凌驾
公共布尔值isReadOnly(ELContext上下文、对象基、对象属性){
返回true;
}
@凌驾
public void setValue(ELContext上下文、对象基、对象属性、对象值){
}
@凌驾
公共对象convertToType(ELContext上下文、对象obj、类targetType){
if(String.class.equals(targetType)&&obj instanceof String&((String)obj).trim().isEmpty()){
context.setPropertyResolved(true);
}
返回null;
}
}

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

/**
 * @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;
    }
}
@覆盖
公共对象convertToType(最终ELContext上下文、最终对象obj、最终类targetType){
if(obj==null&&String.class.equals(targetType)){
context.setPropertyResolved(true);
}
返回null;
}

应用服务器的JVM参数帮助了我。 看

我看过很多关于这个的错误报告Manfried Riem

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

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

实际的修复是在EL中,而不是在JSF中。问题报告中提到的Mojarra版本只是当时最新的Mojarra版本。另见

基本上,要解决这个问题,您需要升级EL实现(或者简单地升级整个服务器,因为它是真正提供EL的服务器)。对于Oracle/Sun EL,该修复程序自2014年7月7日起就已可用(只需选择一个)。您可以将JAR放在
/WEB-INF/lib
中,如有必要,将以下配置添加到
WEB.xml
,以防您的服务器附带与Oracle/Sun EL不同的EL实现,这也会暴露相同的错误:


com.sun.faces.expressionFactory
com.sun.el.ExpressionFactoryImpl
或者,您可以安装替代EL实现,例如:


com.sun.faces.expressionFactory
奥德修斯表达工厂
如果您使用的是MyFaces而不是Mojara,请使用
org.apache.MyFaces.EXPRESSION\u FACTORY的


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

我们测试了所有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 fixed@faces-config.xml级别的自定义ELResolver包装

结果是一样的。String MethodExpression null被解释为空字符串“”

从EL调用t=null的以下方法

案例1

 @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;
}
案例2

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

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

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

使用最新的glassfish 4.0.1仍然是brokenBalus C对convertToType函数()公共对象convertToType有一点变化(ELContext context,Object value,Class targetType){if(value==null&&targetType==String.Class){context.setPropertyResolved(true);}返回值;}记录在案:WildFly 8.1仍然存在这个问题。WildFly 8.2似乎在工作Hi BalusC,这对我不起作用。我正在使用Tomcat 8.0.28和Maven下载org.glassfishjavax.el3.0.1-b05compile,但仍然不起作用。我像您一样配置web.xml,但不起作用。如果您能测试并帮助我解决这个问题,我将非常感激@Diego:它必须在运行时类路径中结束。我将依赖范围更改为运行时,但仍然不起作用。我找到了解决方案(在tomcat 8上进行了测试)。显示的配置仍然不完整。要正常工作,没有任何“解决方法”,除了在web.xml上显示的响应外,还必须显示上下文参数:“javax.faces.exploration_EMPTY_STRING_SUBMITTED_值_‌​A.‌​“S_NULLtrue”。现在,它就像一个符咒一样工作。@Diego:是的,答案的关键是让上下文参数起作用。另请参见问题。
public final void checkBigDecimal(BigDecimal t) 
...
#{myBean.checkBigDecimal(null)} -> Receive null (OK)