![](/img/trans.png)
[英]using javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL causes viewParam to be null
[英]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.