3

我对我的网络应用程序的这种奇怪行为感到抓狂。我不得不将它从 EJB3 更改为 Spring,现在我面临一个(至少对我而言)奇怪的错误。我有一些普通的 JSF 页面(Primefaces 3.4)并创建了一些过滤器。这一切都很好,但我所有的过滤BigInteger值现在总是0而不是null. 结果是,我的 db-query 现在总是将0 - values.. 添加到我的查询中。这不是我想要的。每一个建议都会非常感激。我已经添加了

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

到我的WEB.xml,但这并没有改变任何东西......

编辑: 因此,解决方案是将 EL 从 Tomcat 7.0 更改为“标准”EL。这有点奇怪。我的 web.xml 现在看起来像这样:

  <context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
  </context-param>

我的 pom 看起来像这样:

 <dependency>
     <groupId>javax.el</groupId>
     <artifactId>el-api</artifactId>
     <version>2.2</version>
  </dependency>
  <dependency>
     <groupId>org.glassfish.web</groupId>
     <artifactId>el-impl</artifactId>
     <version>2.2</version>
  </dependency>

哇...现在它可以工作了..仍然很困惑...

4

1 回答 1

5

此行为特定于 Tomcat 6.0.16 和更高版本。它过于严格地遵循EL 规范,该规范说数字类型应该被强制为零,并且优先于应该被强制为null. 换句话说,不仅数字原语(例如int,long等)被强制为零,而且其包装类型表示(例如Integer, Long, BigInteger,BigDecimal等)也被强制为零而不是null.

您需要添加以下 VM 参数来禁用这种不直观的行为:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

当然,您也可以像您所做的那样用 Glassfish EL 实现替换 Tomcat EL 实现(请注意,它不是您暗示的“标准 EL”,它只是“参考实现”)。

请注意,这一切都与 Spring 或 EJB 无关,这只是巧合或不正确的观察。

也可以看看:

于 2012-10-09T13:06:46.803 回答