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
어노테이션을 활용해주면 됩니다.
이 어노테이션은 생성자의 속성을 지정해주는 역할을 합니다.
입력받는 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;
}
}
동일한 문제가 발생했는데 해결됐습니다. 감사합니다.