[스프링] @RequestBody 파싱이 제대로 안될 때(null)
프로그래밍/서버2021. 4. 9. 11:32
문제 현상
{
"userId": "99999",
"nickName": "TEST",
"fToken": "dsfsdfsdf"
}
테스트를 위해 Postman에서 위와 같은 request를 서버로 날리면 fToken만 제대로 파싱이 되지 않아 DTO의 fToken 값이 null이 되는 문제가 발생했습니다.
*User DTO
@Data
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
public static class UserInsert {
String userId;
String nickName;
String fToken;
}
원인
public String getUserId() {
return this.userId;
}
public String getNickName() {
return this.nickName;
}
public String getFToken() {
return this.fToken;
}
public void setUserId(final String userId) {
this.userId = userId;
}
public void setNickName(final String nickName) {
this.nickName = nickName;
}
public void setFToken(final String fToken) {
this.fToken = fToken;
}
Lombok에 의해 위의 setter/getter가 자동 생성됩니다.
Controller의 특정 함수에서 json을 담은 request를 전달 받으면 스프링에선 Jackson을 이용하여 자바 객체를 만듭니다. 이 때 setter/getter를 이용해서 필드값을 채우는 데 이 때 규칙이 있습니다.
userId를 설정할 때는 setUserId(), getUserId()를 찾기에 문제가 되지 않습니다.
그런데 fToken처럼 소문자 1개만 있고 바로 그 다음이 대문자인 경우에는 Jaskson에서 setFToken(), getFToken()을 찾는게 아니라 setfToken(), getfToken()함수를 찾습니다. 이 함수가 없기 때문에 그냥 무시하고 넘어가게 되고 결국 null 값을 가지게 됩니다.
해결 방법
방법1. 직접 setfToken(), getfToken() 함수를 만들어도 됩니다.
방법2. 혹은 아래와 같이 @JsonProperty 어노테이션을 이용해 json property의 이름을 명시해줘도 됩니다.
@JsonProperty("fToken")
String fToken;
*추가로 map struct를 쓰면 DTO에서 Entity로 변환시킬 때 또 문제가 생깁니다.
아래와 같이 명시적으로 Mapping을 선언해주면 문제가 해결됩니다.
@Mapping(source = "fToken", target = "fToken")
User userInsertToUser(UserDto.UserInsert userInsert);
댓글 영역