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
'프로젝트' 카테고리의 다른 글
앱으로 보내는 멀티 스레드 단체 알림 진행도 처리하기 (0) | 2024.07.14 |
---|---|
사용하면서 느낀 Kotlin의 Null Safety (0) | 2024.07.01 |
Java에서 Mybatis Custom TypeHandler 생성해서 사용하기 (0) | 2024.06.02 |
client intended to send too large body 문제 해결하기 (0) | 2024.05.27 |
IntelliJ Compound 기능으로 여러 프로젝트를 한 번에 실행시키기 (0) | 2024.05.12 |