WindsomeProject - org.thymeleaf.exceptions.TemplateInputException

박민수·2024년 2월 13일
0

WindsomeProject

목록 보기
24/32
post-thumbnail

개요

게시글에 작성되는 댓글 중에서 비밀글 설정이 있는 경우, 작성자와 관리자만 해당 댓글을 확인할 수 있도록 Thymeleaf의 SpEL(Servlet Expression Language)을 활용하여 구현하고자 했다. 그러나 SpEL을 사용하여 Enum 값과 Enum 값을 비교할 때 org.thymeleaf.exceptions.TemplateInputException 오류가 발생했다.

오류가 발생한 코드

/* Account.java */

@Entity
public class Account extends BaseTimeEntity {
    // 생략
    @Enumerated(EnumType.STRING)
    private Role state;
}
/* Role.java */

@Getter
public enum Role {
    USER, ADMIN;
}
<!-- qa.html -->

<th:block th:if="${account.state eq T(com.windsome.constant.Role).ADMIN}">
  <!-- 관리자 권한을 갖고있을 경우 보여질 코드 -->
</th:block>
<th:block th:if="${account.state eq T(com.windsome.constant.Role).USER}">
  <!-- 유저 권한을 갖고있을 경우 보여질 코드 -->
</th:block>

위와 같이 Enum 값과 Enum 값을 비교하면 org.thymeleaf.exceptions.TemplateInputException 오류가 발생한다. 그러나 각각을 실행해보면 오류 없이 출력되는 것을 확인할 수 있다.

<span th:text="${account.state}"></span> <!-- USER 출력 -->
<span th:text="${T(com.windsome.constant.Role).USER}"></span> <!-- USER 출력 -->

해결 방법

위 코드에서 오류가 발생하는 이유는 명확하지 않았지만 두 가지 해결 방안을 찾을 수 있었다.

  1. Thymeleaf에서 제공하는 toString 메소드를 이용하여 Enum 값을 문자열로 변환하여 'ADMIN'과 비교한다.
${#strings.toString(account.state) == 'ADMIN'}
  1. Enum 클래스의 name() 메소드를 이용하여 Enum 값을 불러오지 않고 String 값을 불러와 서로 비교한다.
${account.state.name == T(com.windsome.constant.Role).ADMIN.name}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보