<!-- NO -->
<div th:replace="~{fragments :: someSection(info=${info})}"
     th:unless="${info == null}"></div>

<!-- YES -->
<th:block th:unless="{info == null}">
  <div th:replace="~{fragments :: someSection(info=${info})}"></div>
</th:block>

분명 fragments replace 조건에 not null을 넣어 놨는데, 파라미터가 null인 경우에도 fragement가 evaluate 되면서 SpEL error가 발생했다.

왜 그런가 좀 찾아보니 fragment replace 하는 부분(inclusion)의 우선순위가 Condition evaluation보다 높아서 먼저 되기 때문. (Attribute Precedence 참고)

따라서 별도 th:block으로 분리하면 해결된다.

 

<table th:replace="${info} ? ~{fragments :: someSection(info=${info})} : _">

 

thymeleaf 3.0 이상 사용한다면 no-operation token을 사용하는 방식으로 더 간단히 사용할 수 있다.

 

참고자료

https://stackoverflow.com/a/41130027/4295499

반응형