[Error] JSON parse error; Cannot construct instance of ...

김대니·2023년 1월 18일
1

에러 핸들링

목록 보기
2/2

에러 상황

API 를 개발할 때 JSON 데이터를 requestBody 로 주로 받습니다.

requestBody 에 해당하는 DTO 를 만들어두고 아래처럼 요청을 받습니다.

@PostMapping("/api/v1/user")
public ResultResponse<UserDto> createUser(
	@RequestBody CreateUserRequestBody
) {
	...
}

public class CreateUserRequestBody {
	private final String userName;
    private final String mobile;
    private final String email;
    ...
    
    public CreateUserRequestBody(
    	String userName,
        String mobile,
        String email
    ) {
    	this.userName = userName;
        this.mobile = mobile;
        this.email = email;
    }
}

(예제로 만들었습니다.)

위 코드는 POST /api/v1/user API 로 사용자를 생성하는 API 입니다. requestBody 로는 CreateUserRequestBody 객체를 받게 되며 userName, mobile, email 총 3개의 필드가 존재합니다.

이렇게 API 를 만들어두고 POSTMAN 등을 통해 호출을 해보겠습니다.

JSON 데이터는 아래처럼 요청을 보내보겠습니다.

{
	"userName": "dhkim",
  	"mobile": "010-1234-5678",
  	"email": "abcde@gmail.com"
}

만약 lombok 라이브러러의 버전이 낮으면 아래처럼 에러가 발생할 수 있습니다.

JSON parse error: Cannot construct instance of ....CreateUserRequestBody (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException:

에러 해결

위 에러를 해결하기 위해서는 java.beans 라이브러리의 @ConstructorProperties 어노테이션을 활용해주면 됩니다.

@ConstructorProperties

이 어노테이션은 생성자의 속성을 지정해주는 역할을 합니다.

입력받는 JSON 을 파싱하여 객체의 필드와 맵핑을 시켜줍니다.

사용 방법

@ConstructorProperties 어노테이션을 생성자 위에 작성하고 내부 필드명을 적으면 됩니다.

public class CreateUserRequestBody {
	private final String userName;
    private final String mobile;
    private final String email;
    ...
    
    @ConstructorProperties({"userName", "mobile", "email"})
    public CreateUserRequestBody(
    	String userName,
        String mobile,
        String email
    ) {
    	this.userName = userName;
        this.mobile = mobile;
        this.email = email;
    }
}
profile
?=!, 물음표를 느낌표로

1개의 댓글

comment-user-thumbnail
2023년 3월 23일

동일한 문제가 발생했는데 해결됐습니다. 감사합니다.

답글 달기