JSF EJB3到Spring 3,BigInteger总是0而不是null

时间:2012-10-09 11:25:31

标签: java spring jsf tomcat el

我对我的webapplication的奇怪行为感到疯狂。 我不得不将它从EJB3更改为Spring,现在我面临一个(至少对我而言)奇怪的错误。我有一些正常的JSF页面(Primefaces 3.4)并创建了一些Filter。这一切都很好,但我所有过滤的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>
哇...现在它有效......仍然困惑......

1 个答案:

答案 0 :(得分:5)

此行为特定于Tomcat 6.0.16及更高版本。 严格遵循EL specification,它表示数字类型应强制为零,并且优先于应强制转换为null的对象类型。换句话说,不仅intlong等数字基元被强制为零,而且其包装类型表示也被强制为IntegerLong,{ {1}},BigInteger等被强制为零而不是BigDecimal

您需要添加以下VM参数以禁用此非直观行为:

null

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

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

另见: