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 の一部に該当する。