티스토리 뷰

 

문제 상황은 다음과 같다.

 

단건 저장 위해서 아래와 같은 요청 객체를 만들었다.

data class QuizRequestDto(
        val question: String,
        val answer: String,
        val hint: String?
        val order: Int,
        val visible: String
)

그리고 정상적으로 동작하는 것을 확인하고, Bulk 수행을 위해서 다음과 같은 요청 객체를 만들었다.

data class QuizListRequestDto(
        val quizList: List<QuizRequestDto>
)

테스트 요청을 날려보니 아래와 같은 에러를 뱉는다.

11:36:51.103 [http-nio-8080-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.prep.admin.quiz.model.request.QuizListRequestDto]] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `QuizListRequestDto` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

객체를 역직렬화 해주려고하는데, 생성자가 없다라는 의미이다.

 

이럴떄는, 아래와 같이 @JsonCreator라는 어노테이션으로 constructor를 생성해주면 된다.

data class QuizListRequestDto @JsonCreator constructor (
        val quizList: List<QuizRequestDto>
)

혹은 아래와 같이 빈 리스트를 만들어줘도 된다.

data class QuizListRequestDto(
        val quizList: List<QuizRequestDto> = emptyList()
)

어떻게보면, 옛날에 썼던 포스팅 중 하나인 이 글과 유사한 문제이다.

 

역직렬화를 하기위해서 필요한 생성자가 없다는 의미로 객체를 저장할 때 필요한 생성자를 만들어주면 된다.

 

자바같은 경우는 Lombok을 사용하기 때문에 @NoArgConsturctor 어노테이션으로 해결이 됐는데,

 

코틀린에서는 자바처럼 디폴트로 롬복을 사용하지 않기 때문에 객체를 초기화할 때, 위와 같은 별도의 처리가 필요하다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함