在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?

In JSTL/EL, how exactly are enum-to-string comparisons supposed to work?

给定一个 JSP 页面,并且一些对象绑定到一个名为 "foo" 的请求属性,我可以参考 "foo" 与:

${foo}

如果 "foo" 的值有一个 bean 属性 调用,比如说 "type",并且 "type" 的类型是一些 enum class,那么为了进行比较,我会使用一个字符串:

<c:if test='${foo.type == "WHATEVER"}'>

然后假设我的 enum class 中的常量之一具有名称 "WHATEVER",该比较应该有效,并产生 truefalse.

现在我想知道 servlet 容器应该如何准确地执行该比较。一些 Oracle 文档(here)暗示(模糊地)发生的事情是将字符串常量转换为 enum 类型,然后进行比较。

我正在调查一种情况,我 认为 在 Jetty/Tomcat(即 Apache)和 Resin 之间工作方式不同。 Apache 世界似乎在做正确的事情,或者至少是我根据 Oracle 的文档所期望的事情。

我担心的是我的 enum 中的另一个 属性 可能会导致 Resin 实现做一些不同的事情。具体来说,我的 enum class 有一个 .toString() 实现,returns 与 .name() 返回的字符串不同。这个怪癖不会在 Apache 服务器中造成任何问题,或者至少 none 我所见过的。如果 Resin 通过将枚举常量转换为字符串(通过 .toString(),而不是 .name())而不是将字符串转换为 enum 类型来实现比较,那么事情将无法始终如一地进行。

请注意,在所有其他方面,我在 JSP/JSTL/EL 中以各种其他方式使用我的 enum 类型(其中很多都是这样)没有任何问题。事实上,JSP 中只有少数地方有 EL 逻辑,因为应用程序通过客户端模板渲染完成大部分工作。

edit — 我很确定我确认 Resin 以不同的方式进行比较,尽管我不知道那是什么。我在自己的 EL 函数库中有一个(由于我不记得的原因)"name" EL 函数,所以我可以用它来解决这个问题。

很遗憾,Resin 处理不正确。我已在 http://bugs.caucho.com/view.php?id=5925

提交错误