반응형
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of ~~
(no Creators, like default constructor, exist): cannot deserialize from Object value
api콜을 하는 과정에서 Json형식으로 받은 RequestBody를 커스텀 객체로 변환하지 못한다면 위와 같은 에러가 발생할 수 있습니다.
예를들어 유저를 추가하는 아래의 소스가 정의되어 있다고 가정해봅시다.
@PostMapping(value = "/users")
@ResponseBody
public boolean insertUser(@RequestBody User user){
boolean insertResult = userService.insertUser(user);
return insertResult;
}
위와 같이 api콜의 body를 통해 User객체를 받기 위해서는 User 클래스가 Json데이터를 User객체로 변환할 수 있어야 합니다.
이를 위해 데이터클래스(dto)의 기본 생성자(lombok에서 builder)에 jackson라이브러리의 JsonCreator 어노테이션 사용하고, 속성에는 JsonProperty어노테이션, json attribute key값을 설정할 수 있습니다.(lombok 빌더를 사용한다고 가정하겠습니다.)
그러면 아래와 같은 User클래스를 구성할 수 있습니다.
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
@Getter
@Setter
@ToString
public class User {
long id;
String password;
String tel;
String name;
@JsonCreator
@Builder
public User(
@JsonProperty("id") long id,
@JsonProperty("password") String password,
@JsonProperty("tel") String tel,
@JsonProperty("name") String name
) {
this.id = id;
this.password = password;
this.tel = tel;
this.name = name;
}
}
이처럼 request mapping을 통해 Json으로 받은 RequestBody를 rest Api 프로젝트의 dto객체 형식으로 변경할 수 있습니다.
※ 참고 : lombok과 jackson 라이브러리 의존성 추가
// lombok
implementation 'org.projectlombok:lombok'
//jackson for request result to json
//responsebody -> json
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.0'
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.0'
'IT 프로그래밍-Server' 카테고리의 다른 글
모바일신분증 연계서비스 연동하기-1 (0) | 2023.08.16 |
---|---|
[Android-spring boot] ResponseBody로 String반환 시 발생 오류 (0) | 2021.05.30 |
AWS를 이용하여 백엔드 서버 배포하기[4/4] (0) | 2020.02.28 |
AWS를 이용하여 백엔드 서버 배포하기[3/4] (0) | 2020.02.08 |
AWS를 이용하여 백엔드 서버 배포하기[2/4] (0) | 2020.02.07 |