KOTLIN

[KOTLIN] InvalidDefinitionException: Cannot construct instance of `XXX` (no Crea

민덕이 2024. 8. 21. 23:34
반응형

코프링(Koltin + Spring)에서 JacksonObjectMapper를 커스텀하게 만들어 사용할 경우 InvalidDefinitionException이 발생할 수 있다.[Cannot construct instance of `XXX` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)]
 
코틀린의 경우 클래스에 기본 값을 설정하지 않으면, 기본 생성자를 생성하지 않아 발생하는 예외이다.
그렇다고 일일히 클래스에서 기본 값을 설정하는 것은 좋은 방법이 아니다.

 
이를 해결하기 위해서는 스프링 부트 웹에서 빈으로 등록되는 ObjectMapper가 어떻게 만들어지는 지를 알아봐야 한다. 
 
기본적으로 스프링 부트 autoconfigureJacksonAutoConfiguration 클래스의 내부 클래스인 JacksonObjectMapperConfiguration에서 ObjectMapper를 만들어준다.

 
JacksonObjectMapperConfiguration을 보면 builder.createXmlMapper(false).build()에서 ObjectMapper 설정을 하는 부분이 있다.
이 설정 부분으로 인해 기본 빈으로 등록된 ObjectMapperInvalidDefinitionException가 발생하지 않는 것이다.

 
 

해결 방법

우리가 등록할 커스텀한 ObjectMapperJackson2ObjectMapperBuilderDI 받아 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와 똑같이 사용하는게 좋을 것 같다고 생각한다.

반응형