Thymeleaf で isXxx プロパティを参照するとエラーになる

概要

Thymeleaf の変数式で ${aVariable.isXxx} とするとエラーになって困った時の記録です。

確認環境

  • Spring Boot 1.4.2
    • Spring 4.3.4
    • Thymeleaf 2.1.5, 3.0.0
  • Kotlin 1.0.5

解説

Kotlin で次のクラスを作成したとする。

data class User(
    val name: String,
    val age: Int,
    val address: Address,
    val isEnabled: Boolean)

Java ならば以下のようになる。

public class User {

    private final String name;
    private final int age;
    private final Address address;
    private final boolean isEnabled;

    public boolean isEnabled() {
        return isEnabled;
    }

    ... (setter/getter, toString, equals, hashCode メソッドと続くが省略)
}

Thymeleaf では User オブジェクトの isEnabled プロパティを参照するために以下のように書く。

<span th:text="${user.isEnabled}">どうなるでしょう?</span>

これはエラーになる。isEnabled プロパティが見つからないと。 isEnabled ではなく enabled とすることで参照できる。

<span th:text="${user.enabled}">参照できる</span>

何故エラーになるのかと思い、デバッガで確認した。

org.springframework.expression.spel.support.ReflectivePropertyAccessor クラスの findGetterForProperty メソッドでは、 propertyName=isEnabled を IsEnabled に変換した後に findMethodForProperty メソッドを呼ぶ。

findMethodForProperty メソッドでは、prefix=is と methodSuffix=IsEnabled を結合して isIsEnabled とした上でメソッド名と equals で比較。

プロパティ名を enabled とすれば、isEnabled となるため参照できる。

Thymeleaf は内部的に SpEL (非SpringではOGNL) を使って式を解釈している。 上記は SpEL の一部に該当する。