尝试使EL条件正常工作时,我发现枚举值被完全忽略。在我看来,这与规范背道而驰。
<c:out value='${com.foobar.data.BookingStatus.FAILED}' /> <c:out value='${BookingStatus.FAILED}' /> <c:out value='${com.foobar.data.BookingStatus.failed}' /> <c:out value='${BookingStatus.failed}' /> <c:if test="${empty BookingStatus.FAILED }">empty</c:if>
令我惊讶的是,这些全部评估为 空 。为什么不能识别Enum类?这是在当前稳定的Tomcat实例中发生的。
这可以是类路径问题吗?在控制器代码中成功使用了Enum,但在JSP中没有其他地方。它位于部署的lib目录中的jar中。
更新:
我的意图是将提供的Integer与Enum的属性进行比较,如下所示:
<c:when test='${bookingInformation.bookingStatus eq BookingStatus.FAILED.code}'> FOOBARFAIL </c:when>
不幸的是,被检查的值无法更改,并将保持为整数。枚举看起来如下(简化):
public enum BookingStatus { COMPLETED(0), FAILED(1); private final int code; private BookingStatus(int code) { this.code = code; } public int getCode() { return code; } }
我想避免硬编码FAIL等的Integer值,而使用枚举代替进行比较。
这是因为当前版本的EL不支持访问枚举或调用枚举常量。仅EL 3.0提供此支持。
目前尚不清楚您的意图是什么,但是很高兴您可以将枚举属性作为StringEL中的一个进行比较。它们即被解析为String。
String
假设您有一个如下所示的bean:
public class Booking { public enum Status { NEW, PROGRESS, SUCCESS, FAILED } private Status status; public Status getStatus() { return status; } }
然后,您可以Status.FAILED按以下方式测试条件:
Status.FAILED
<c:if test="${booking.status == 'FAILED'}"> Booking status is FAILED. </c:if>