[스프링] @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);

 

참고

www.programmersought.com/article/99231692158/

작성자

Posted by 드리머즈

관련 글

댓글 영역