-
[KOTLIN] InvalidDefinitionException: Cannot construct instance of `XXX` (no CreaKOTLIN 2024. 8. 21. 23:34반응형
코프링(Koltin + Spring)에서 Jackson의 ObjectMapper를 커스텀하게 만들어 사용할 경우 InvalidDefinitionException이 발생할 수 있다.[Cannot construct instance of `XXX` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)]
코틀린의 경우 클래스에 기본 값을 설정하지 않으면, 기본 생성자를 생성하지 않아 발생하는 예외이다.
그렇다고 일일히 클래스에서 기본 값을 설정하는 것은 좋은 방법이 아니다.
이를 해결하기 위해서는 스프링 부트 웹에서 빈으로 등록되는 ObjectMapper가 어떻게 만들어지는 지를 알아봐야 한다.
기본적으로 스프링 부트 autoconfigure가 JacksonAutoConfiguration 클래스의 내부 클래스인 JacksonObjectMapperConfiguration에서 ObjectMapper를 만들어준다.
JacksonObjectMapperConfiguration을 보면 builder.createXmlMapper(false).build()에서 ObjectMapper 설정을 하는 부분이 있다.
이 설정 부분으로 인해 기본 빈으로 등록된 ObjectMapper는 InvalidDefinitionException가 발생하지 않는 것이다.
해결 방법
우리가 등록할 커스텀한 ObjectMapper도 Jackson2ObjectMapperBuilder를 DI 받아 builder.createXmlMapper(false).build()로 ObjectMapper를 만들고, 커스텀한 설정을 추가하면 InvalidDefinitionException가 발생하지 않는다.
@Configuration class JacksonConfig { @Bean fun objectMapper(builder: Jackson2ObjectMapperBuilder): ObjectMapper { // val objectMapper = ObjectMapper() // InvalidDefinitionException 예외 발생 val objectMapper: ObjectMapper = builder.createXmlMapper(false).build() // 스프링에서 기본적으로 등록해주는 ObjectMapper와 동일하게 생성, 정상 동작 // 커스텀 설정 추가 ... return objectMapper } }
이 방법 말고도, 직접 커스텀 설정에 설정을 추가하여 해결할 수 있는데, 스프링에서 기본적으로 생성한 ObjectMapper와 똑같이 사용하는게 좋을 것 같다고 생각한다.반응형'KOTLIN' 카테고리의 다른 글
[Kotlin] Kotlin 1.6 주요 변경점 (0) 2024.10.03 [Kotlin] Kotlin 1.4 주요 변경점 (0) 2024.10.01 [Kotlin] Kotlin 1.3 주요 변경점 (0) 2024.09.30 [Kotlin] Kotlin 1.2 주요 변경점 (1) 2024.09.29 [Koltin] Koltin 1.1 주요 변경점 (1) 2024.09.28