所以我已经离开 Java EE 六个月了,现在我回来并将应用程序迁移到Java EE 7,我注意到JSR-341/EL 3.0 规范。包含类型转换部分的更改(现在,第 1.23 节;以前,第 1.18 节)。
在 1.23 节中,除了 String 之外的所有各种类型的第一条规则是,如果 X 为 null 且 Y 不是原始类型,则返回 null。这是一个非常受欢迎的变化。
所以我的第一个问题是:关于第 1.23.3 节 Coerce A to Number type N,
在 EL 2.1 中:
如果 A 为 null 或 "",则返回 0。
在 EL 3.0 中:
如果 A 为 null 且 N 不是原始类型,则返回 null。
否则,如果 A 为 null 或 "",则返回 0。
现在不再需要设置系统属性了org.apache.el.parser.COERCE_TO_ZERO=false
吗?
接下来,还有一些其他的变化引起了人们的质疑:
在第一小节第 1.23.1 节(以前的 1.18.1)中,为了将值 X 强制转换为类型 Y,给出了一般情况的规则。现在,添加了一个新项目符号(强调我的):
如果 X 为 null 且 Y 不是原始类型也不是 String,则返回 null。
在 1.23.2 Coerce A to String部分中,前两个项目符号已翻转。它们现在按以下顺序排列:
如果 A 为空:返回“”<br> 否则,如果 A 为字符串:返回 A
看起来,虽然之前空字符串在强制之后仍然是空字符串,但现在空字符串被强制转换为空字符串。所以我的第二个问题是:我是否正确地阅读了这个,String 现在在强制方面的处理方式与其他类型的对象不同?如果是这样,为什么?
这种变化似乎违反直觉,因为我们都知道 null 具有特殊含义。此外,这种变化令人担忧,因为它会对我正在迁移的代码产生不利影响,这些代码最初是针对旧规范编写的。
最后,我的第三个问题是:bean 验证呢?这是否意味着现在@NotNull
支持 bean 中的字符串注释是无用的,因为强制字符串值永远不能为空?我对此表示怀疑,但我想知道新的变化是如何协同工作的。