JSF 2.2 将提交的空字符串值解释为 null 不起作用
Posted
技术标签:
【中文标题】JSF 2.2 将提交的空字符串值解释为 null 不起作用【英文标题】:JSF 2.2 interpret empty string submitted values as null not working 【发布时间】:2013-11-03 17:05:51 【问题描述】:我已经从 Java EE 6 迁移到 Java EE 7,现在使用 JSF 2.2,上下文参数 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
似乎不起作用。在 JSF 2.1 中,我将其设置为“true”并且它运行良好,但现在我总是得到空白字符串。
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
谁能说一说?
【问题讨论】:
可能是实现中的错误。能否调试环境以确认是否是 mojarra 源中的错误? javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL does not work anymore since Java EE 7 / EL 3.0 的可能重复项 【参考方案1】:带有最新 Mojarra-2.2.5 的 glassfish 4 也是如此 以及 Wildfly 8 Final 。 . .我已经看到了多个关于此的错误报告,Manfried Riem 说“已确定这是一个 EL 问题,并且已修复 EL 实现以解决此问题”,但不确定这是否意味着更新 Mojarra 可以修复它,因为它不在 glassfish 4. 我也更新了el,还是不行。
【讨论】:
【参考方案2】:不幸的是,Glassfish 4 中似乎存在一个错误。
见:
INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL doesn't work at all
和:
Empty String as Null is not effective in 2.2.0
【讨论】:
【参考方案3】:Apache el 实现执行空字符串(或 0 int 值)。你可以在 org.apache.el.parser.AstValue 类中找到它:
public void setValue(EvaluationContext ctx, Object value)
throws ELException
Target t = getTarget(ctx);
ctx.setPropertyResolved(false);
ELResolver resolver = ctx.getELResolver();
// coerce to the expected type
Class<?> targetClass = resolver.getType(ctx, t.base, t.property);
if (COERCE_TO_ZERO == true
|| !isAssignable(value, targetClass))
resolver.setValue(ctx, t.base, t.property,
ELSupport.coerceToType(value, targetClass));
else
resolver.setValue(ctx, t.base, t.property, value);
if (!ctx.isPropertyResolved())
throw new PropertyNotFoundException(MessageFactory.get(
"error.resolver.unhandled", t.base, t.property));
您可以将 COERCE_TO_ZERO 设置为 false (-Dorg.apache.el.parser.COERCE_TO_ZERO=false)。
或者使用其他的el impl:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
并设置上下文参数:
servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl");
那是 el-api 方面。
另一边是JSF。您必须为 JSF 设置此上下文参数:
servletContext.setInitParameter("javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", "true");
对不起我的英语!
【讨论】:
【参考方案4】:现在情况更加混乱。 我正在使用 JSF 2.2.8-SNAPSHOT,虽然在 JSF bean 验证期间该值被解释为 null,但实际值集是一个空字符串。这意味着其他组件进行验证,例如JPA 长度验证失败,因为字符串值为“”。
因为这显然需要spec change,所以我不会很快想到这个。 jira 还包含此post 中描述的解决方法。
附言。这可能是正确的行为,因为 documentation 声明 null 已传递给 bean 验证框架,但这根本不直观。
【讨论】:
【参考方案5】:应用程序服务器的 JVM 属性在类似情况下帮助了我。请看Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1
【讨论】:
【参考方案6】:我在下面尝试过并且得到了工作。我们需要在 web.xml 中添加这个条目
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>true</param-value>
</context-param>
【讨论】:
以上是关于JSF 2.2 将提交的空字符串值解释为 null 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
WebApi jsonFormatter如何将空字符串值更改为空字符串
使用 Json 反序列化在 Java 中自动将空字符串转换为 null