<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的发行说明中说明,我错过了什么?
答案 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)