본문 바로가기

Issue

webclient로 json파싱할 때 주의할 점

아래와 같은 코드로 json response를 responseType 클래스에 대입하였음

//url로 요청 보내고 T타입 객체 받아옴
//Mono객체가 멀티스레딩에 유리함
public <T> T getCustom(String baseUrl, String path, Object paramForm, Class<T> responseType) {
    String url =makeRiotRequestUrl(baseUrl, path, paramForm);
    log.info("riot api request = {}",url);
    return WebClient.builder().build().get().uri(url)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToMono(responseType)
            .block();
}

 

이 때, 필드명이 다르면 null 또는 기본값이 들어감

-primitive type의 경우 기본값

 

 

아래와 같은 경우 json object의 필드값은 metadata, info인데 나는 뒤에 DTO를 붙여놨기 때문에 데이터가 대입되지 않았고, @JsonProperty를 설정하여 해결하였음

@Getter
@Setter
@ToString
public class MatchDTO {
    @JsonProperty("info")
    private InfoDTO infoDTO;
    @JsonProperty("metadata")
    private MetadataDTO metadataDTO;
}

 

아래와 같은 경우 필드명은 같았으나 오타가 있었고(아래 코드에는 수정된 상태) 때문에 데이터가 들어오지 않았다.

@Getter
@Setter
@ToString
public class MetadataDTO {
    private String dataVersion;
    private String matchId;
    private List<String> participants;
}

 

- 기능 구현시마다 테스트를 하는 방침 덕분에 미리 발견할 수 있었다.

- 인텔리제이 IDE의 오타 체크 덕분에 오타로 인한 미적용 문제를 쉽게 발견할 수 있었다. 쉽게 지나치던 오타 부분도 주의깊게 살펴봐야겠다고 느꼈음.