【问题标题】:JSF EJB3 to Spring 3, BigInteger is always 0 instead of nullJSF EJB3 到 Spring 3,BigInteger 始终为 0 而不是 null
【发布时间】:2012-09-29 17:22:39
【问题描述】:

我对我的 web 应用程序的这种奇怪行为感到抓狂。 我不得不将它从 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>

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

【问题讨论】:

    标签: java spring jsf tomcat el


    【解决方案1】:

    此行为特定于 Tomcat 6.0.16 和更高版本。 严格遵循EL specification,它说数字类型应该被强制为零,并优先于应该被强制为null的对象类型。换句话说,不仅诸如intlong等数字原语被强制为零,而且其包装类型表示如IntegerLongBigIntegerBigDecimal等也被强制为零被强制为零而不是null

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

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

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

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

    另见:

    【讨论】:

    • 感谢您的回复。我想我只是感到困惑,因为我不认为服务器可能是问题所在。当然,您是对的 :) glassfish 不是标准,也不是 spring 或 EJB 的问题。我很高兴我能以某种方式解决它!但是非常感谢您的解释......现在这个问题对我来说更清楚了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2020-07-25
    • 2021-05-29
    • 1970-01-01
    • 2019-12-03
    • 2016-05-09
    相关资源
    最近更新 更多