[Kotlin] Cannot construct instance of 에러

0

Kotlin

목록 보기
2/32
  • 메인 에러 메시지
    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.------.----.----.---.request.user.UserChangeRequest(no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
  • Kotlin 프로젝트 REST API TEST를 하던 와중 회원정보 수정하는 api에서 에러가 떴다.
  • 에러를 구글링했더니 생성자가 없다, JSON뭐시기 @JsonTypeInfo 를 붙여라 같은 얘기들이 많이 나왔다.
    -> 어노테이션을 붙여서 해결될 문제는 아닌것 같았고 (이미 Mock 테스트까지 잘 돌아가는 중이였음)
  • 테스트 코드 쪽 문제인가해서 swagger로 api를 돌려보니까 거기서도 동일한 에러가 발생.
    -> 테스트 코드쪽 문제는 아니고 원래코드가 문제라고 판단.

하지만 난 문제 해결할 수 없을 것 같아서 선임님한테 질문했다.
몇시간 동안 고민했던 문제가 1분만에 해결됐음.
-> Controller 쪽에서 @RequestBody request: UserChangeRequest 로 돼있었는데 UserChangeRequest -> UserChangeRequestImpl 로 변경해야 한다는 것.

아 request 받는 부분에서 인터페이스로 받아서 생기는 문제네요
kotlin 에서 결과값 받는 부분을 interface로 받으면 제대로 못받는 현상이 있더라구요. 그래서 data class 로 선언된걸 받으면 받는데는 문제가 없더라구요~

라고 말씀해주셨다... 역시 짱짱...


  • 아래는 에러 중 윗부분만 가져왔다. 너무 길어서
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.------.----.----.---.request.user.UserChangeRequest` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 1]
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1909) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:408) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1354) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:274) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105) ~[jackson-databind-2.14.2.jar:2.14.2]
	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481) ~[jackson-databind-2.14.2.jar:2.14.2]
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395) ~[spring-web-6.0.8.jar:6.0.8]
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354) ~[spring-web-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:183) ~[spring-webmvc-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:163) ~[spring-webmvc-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:136) ~[spring-webmvc-6.0.8.jar:6.0.8]
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.0.8.jar:6.0.8]
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:181) ~[spring-web-6.0.8.jar:6.0.8]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:148) ~[spring-web-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.8.jar:6.0.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.8.jar:6.0.8]
profile
백엔드를 공부하고 있습니다.

1개의 댓글

comment-user-thumbnail
2024년 2월 1일

정말 감사합니다

답글 달기