Thymeleafを業務で使っていて、${user?.name}とか${object?.id}みたいな記法を見かけて
使い方が分からなかったのでメモ
※誤りがありましたらご指摘ください。
結論
Safe Navigation operatorと呼ばれるいわゆるNullチェックをしてくれる
Spring Expression Language (SpEL)の記法の一種です。
ちゃんとSpringのドキュメントにものっていますね。
訳してみると、以下のとおりです。
セーフナビゲーション演算子は、NullPointerExceptionを回避するために使用され、Groovy言語に由来する。通常、オブジェクトへの参照がある場合は、オブジェクトのメソッドまたはプロパティにアクセスする前に、それがnullでないことを確認する必要があります。これを回避するために、安全なナビゲーションオペレーターは、例外をスローする代わりに単にnullを返します。
使い方
<tr th:each="o: ${object}">
<td th:text="${o.id}"></td>
<td th:text="${o.user?.name?}"></td>
<td th:if="${o.address?.contains('Tokyo')" th:text=""></td>
<td th:if="${o.salary? gt 10000}" th:text=""></td>
</tr>
例えば、objectエンティティにuserエンティティやaddressエンティティを埋め込んで、
埋め込んだエンティティのフィールドを取得するときにこのように使います。
このように参照したいオブジェクトの後ろに?をつけることで、本来nullであればNullPointerExceptionが帰ってくるところを、nullの場合は空を返してくれます。
上記のように連続でつけることもできますし、必要であれば?のあとにJavaのメソッドを使うこともできます。
(Thymeleaf内でJavaメソッドが使えるのは、ThymeleafがはOGNLというJavaの値にアクセスするための式言語で書かれているため)
注意点
値や配列を扱うフィールドでセーフナビゲーション演算子を使うときは注意が必要です。
この演算子はnullだけでなく、0もfalseと判断するようです。
ちなみに
似たような演算子にエルビス演算子という演算子があるみたいです。
PHPやKotlinでサポートされているそうですが、そういう言語だと普通に使う演算子なのかしら。
以上です。