에러 상황
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;
}
}
'에러 핸들링' 카테고리의 다른 글
Config data resource ... via location ... does not exist (0) | 2023.03.08 |
---|---|
UUID 로 설계한 댓가 (0) | 2023.02.23 |
ArithmeticException 해결하기 (0) | 2023.02.12 |
UriComponentsBuilder 한글 적용이 잘 안될 때 (0) | 2023.02.09 |
Could not open JPA EntityManager for transaction (0) | 2023.02.03 |
댓글