【问题标题】:Calling method with null parameters in EL ends up in 0 being passed instead of null在 EL 中使用 null 参数调用方法最终会传递 0 而不是 null
【发布时间】:2013-05-17 09:12:34
【问题描述】:

我有一个 POJO:

public class Foo {
    public String getValue(Integer arg0, BigDecimal arg1) {...}
}

我把它作为模型参数从 Spring MVC 放到 JSP 中,并尝试使用它:

<c:set var="ans" value="${foo.getValue(null, null)}"/>

但是在getValue方法中

arg0 = 0
arg1 = 0

而不是预期

arg0 = null
arg1 = null

我尝试在 Tomcat 7.0.40 和 jetty 9.0.3 上运行它

是 Tomcat 的错误,还是 EL 的正确工作方式? 如何在 EL 中调用带 null 参数的方法?

更新 1: 几个来源和文档 (http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html) 说添加 JVM 属性

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

解决了。

但是当我设置它时,什么都没有发生。我已经设置好了

System.getProperty("org.apache.el.parser.COERCE_TO_ZERO")` 

在运行时返回"false"

可能是 Tomcat 需要更改一些其他设置才能使用此参数...

【问题讨论】:

  • 这个&lt;c:set var="ans" value="${foo.getValue(null, null)}"/&gt; 无法说服我。使用 JSTL 时,您不能以这种方式调用方法。您可以访问属性而不是${foo.value},并且将在幕后调用相应的 getter。此外,您不能传递参数,因为它假定 getter 是无参数的
  • @maVVamaldo,在 EL 2.2 中是可能的。
  • 有同样的问题。在 Tomcat7 catalina.properties 文件和 ServletContextLoader 中设置 COERCE_TO_ZERO 属性,但不起作用。
  • @azgolfer,这仍然是实际问题。如果您能找到一些解决方案(使用 glassfish 代替 Tomcat 不算数),请告诉我。

标签: java tomcat spring-mvc el


【解决方案1】:

据我所知,当您使用 Null 时,任何程序都会将 Null 值初始化为原语的默认值。这意味着 int 值将始终为 0,double 0.0,boolean 将为 false 等。

你可以做的是做一些额外的测试,并在你的方法开始时验证这些值是否为空,如果是的话,做一些额外的测试。

【讨论】:

  • Integer 和 BigDecimal 初始化为 null,但不是 0。只是 Tomcat EL 解释器使它们为 0。所以在 foo.getValue(...) 中我只能得到 0。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2012-02-20
  • 2021-12-20
相关资源
最近更新 更多