본문 바로가기

프로젝트

Java Spring에서 Kotlin' Data Class의 Json Parsing 문제

Java Spring MVC에서 Json 역직렬화 문제

Kotlin 언어를 사용하면서 데이터의 불변성을 위해 Data Class를 사용을 한다. 그런데 Java Spring Controller에서 API 요청을 받을 때 데이터를 역직렬화를 못하는 문제가 발생한다. Java Spring에서 Jackson 라이브러리를 사용하고 있는데, 이 라이브러리가 Data Class 역직렬화를 못하는 것이었다. Data Class는 데이터 불변성을 위해 Setter를 제공하지 않아, 역직렬화 방식을 사용하지 못하는 것이다.

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: 
Cannot construct instance of `***` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)]

해결하기

Setter를 사용하지 못하기 때문에, Data Class에 모든 필드에 기본값을 설정해주면 해결이 된다. 할당되지 못한 값은 전부 값들이 저절로 기본값으로 채워지기 때문이다. 아니면 요청된 데이터에 따라 부 생성자를 만들어주는 것이다. 하지만 이러한 방법은 각 Data Class마다 적용을 해줘야 하기 때문에 다른 방법을 찾아보기로 했다.

 

✔ Jackson Kotlin Module

Java Spring에서 사용을 하는 Jackson에서 Kotlin에서 사용할 수 있게 나온 라이브러리가 있다. 내가 사용하고 있는 환경과 동일한 방법으로 역직렬화를 할 수 있으며, Data Class마다 적용하는 수고로움을 덜 수 있기 때문에 이 방법을 사용하기로 했다. 

 

✔ 플러그인 Dependency 추가

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.17.+"

 

✔ ObjectMapper 빈 등록

@Configuration
class KotlinObjectMapperConfig {

    @Bean
    fun kotlinObjectMapper(): ObjectMapper {
        return ObjectMapper().apply {
            registerModule(KotlinModule())
            disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
        }
    }
}

 

✔ MvcConfig에 Custom ObjectMapper 등록하기

ObjectMapper에 KotlinModule를 적용을 해주면 되지만 프로젝트 다른 곳에서 ObjectMapper과 같은 이름의 빈이 등록이 되어 있어서 MvcConfig에 추가적으로 ObjectMapper를 등록해주기로 했다.

@Configuration
class WebConfig(
    private val kotlinObjectMapper: ObjectMapper
) : WebMvcConfigurer {

    @Bean
    fun mappingJackson2HttpMessageConverter(): MappingJackson2HttpMessageConverter {
        return MappingJackson2HttpMessageConverter(kotlinObjectMapper)
    }

    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        converters.add(mappingJackson2HttpMessageConverter())
    }
}

참고 링크

 

GitHub - FasterXML/jackson-module-kotlin: Module that adds support for serialization/deserialization of Kotlin (http://kotlinlan

Module that adds support for serialization/deserialization of Kotlin (http://kotlinlang.org) classes and data classes. - FasterXML/jackson-module-kotlin

github.com