프로젝트

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

ironprayer 2024. 6. 9. 23:47

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