无法读取 bean 上的布尔值 属性 'isEmpty'

Cannot read boolean property 'isEmpty' on bean

我在 jsp 中显示 Java bean 的 boolean 属性 时遇到了一个奇怪的问题。似乎一个名为 isEmpty() 的 getter 在 EL 解析器上导致了 ParseException。

出于演示目的,我创建了一个 class 来显示问题。

public class Bookcase {

    public boolean isWithoutContent() {

        return true;
    }

    public boolean isEmpty() {

        return true;
    }

}

正在调用 jsp 中的属性:

${bookcase.withoutContent}

${bookcase.empty}

第一个显示 true 而第二个抛出错误:

org.apache.el.parser.ParseException: Encountered " "empty" "empty "" 
at line 1, column 23.

Was expecting:
    <IDENTIFIER> ...

现在我知道有一个 EL empty 运算符,但显然点运算符建议我在 bookcase 对象上调用 isEmpty() 方法?显然不是,考虑到错误。

在实际的 bean 上我不能/不想重命名 isEmpty() 方法,但是如何在 jsp 中显示这个 属性?

毕竟这很简单:

${bookcase['empty']}

但我仍然感到困惑,为什么在点符号中使用 empty 就像保留字一样。

empty 是 EL 中的一个特殊关键字,它主要检查 nullness 和 emptyness。通常像下面这样使用:

<c:if test="${empty bean.object}"> <!-- if (object == null) -->
<c:if test="${empty bean.string}"> <!-- if (string == null || string.isEmpty()) -->
<c:if test="${empty bean.collection}"> <!-- if (collection == null || collection.isEmpty()) -->
<c:if test="${empty bean.map}"> <!-- if (map == null || map.isEmpty()) -->
<c:if test="${empty bean.array}"> <!-- if (array == null || array.length == 0) -->

但是,您将它用作 bean 属性,EL 感到困惑。 EL specification:

禁止使用 EL 关键字和 Java 标识符作为 bean 属性 名称

1.17 Reserved Words

The following words are reserved for the language and must not be used as identifiers.

and   eq     gt     true   instanceof
or    ne     le     false  empty
not   lt     ge     null   div        mod

Note that many of these words are not in the language now, but they may be in the future, so developers must avoid using these words.

您需要重命名它,或者使用 ${bean['empty']} 中的大括号表示法,或者作为完全不同的替代方案让您的 Bookcase 实现,例如Collection 接口,这样你就可以只使用 ${empty bookcase}.

另请参阅:

  • Evaluate empty or null JSTL c tags
  • How does EL empty operator work in JSF?
  • instanceof check in EL expression language