IT 프로그래밍-Server

[Spring] Request Mapping시 Request Body 설정

godsangin 2020. 6. 4. 13:03
반응형

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'