아래의 간단한 API를 테스트하던 중, 갑작스러운 500 오류가 발생했습니다.
override fun checkCode(email: String, code: String): Boolean {
if (codeRepository.findByEmail(email).orElse(null)?.code == code) return true
return false
}
framework.data.keyvalue.core.UncategorizedKeyValueException: No accessor to set property
@org.springframework.data.annotation.Id()private final java.lang.String
com.we.webackend.domain.user.persistance.entity.Code.id!;
nested exception is java.lang.UnsupportedOperationException: No accessor to set property
@org.springframework.data.annotation.Id()private final java.lang.String
com.we.webackend.domain.user.persistance.entity.Code.id!] with root cause
java.lang.UnsupportedOperationException: No accessor to set property @org.springframework.data.annotation.Id()private final java.lang.String com.we.webackend.domain.user.persistance.entity.Code.id!
위 로그 내용을 살펴보면 private final에 대한 accessor가 존재하지 않는다는 이야기인데, 이해가 되지 않아 구글링해본 결과 해당 내용과 유사한 내용이 존재했습니다.
제 코드 또한 위 내용과 동일한 형태로 작성되어있었습니다.
@RedisHash
class Code(
email: String,
code: String
) {
@Id
val id: String = email + code
protected set
}
답변인즉 Spring Data 2.1부터 immutable objects를 지원하고 더 이상 final을 업데이트 하지 않겠다는 이야기였습니다. kotlin에서 val로 선언 시 java final로 변환되므로 발생한 문제였습니다.