본문 바로가기
에러 핸들링

JSON parse error; Cannot construct instance of ...

by kdohyeon (김대니) 2023. 2. 3.
반응형

에러 상황

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 등을 통해 호출을 할 수 있다. 아래처럼 요청을 보낸다.

{
    "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;
    }
}
반응형

댓글