一尘不染

在JSP EL枚举值中始终为空

jsp

尝试使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值,而使用枚举代替进行比较。


阅读 369

收藏
2020-06-08

共1个答案

一尘不染

这是因为当前版本的EL不支持访问枚举或调用枚举常量。仅EL 3.0提供此支持。

目前尚不清楚您的意图是什么,但是很高兴您可以将枚举属性作为StringEL中的一个进行比较。它们即被解析为String

假设您有一个如下所示的bean:

public class Booking {
    public enum Status { NEW, PROGRESS, SUCCESS, FAILED }

    private Status status;

    public Status getStatus() {
        return status;
    }
}

然后,您可以Status.FAILED按以下方式测试条件:

<c:if test="${booking.status == 'FAILED'}">
    Booking status is FAILED.
</c:if>
2020-06-08