티스토리 뷰

다음과 같이 resultCode, resultMessage, siteId JSON 스트링이 있고, 해당 JSON 스트링 값을 ConstraintData DTO 클래스의 프로퍼티에 bind 시키기 위해 다음과 같은 코드를 사용했다.

String body = {\"resultCode\":1000,\"resultMessage\":\"test\",\"siteId\":1111}


@Data

public class ConstraintData {

private int siteId;

}


ObjectMapper mapper = new ObjectMapper();

ConstraintData data = mapper.readValue(body, ConstraintData.class);


허나, 이와 같이 코드를 작성하게 된다면 다음과 같은 예외를 접하게 될 것이다.

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "resultCode" (Class com.test.dto.base.ConstraintData), not marked as ignorable


이유는 JSON 스트링에는 resultCode, resultMessage name이 존재하지만 ConstraintData 클래스에는 해당 멤버 변수가 존재하지 않기 때문이다.

예외 내용을 살펴보면 "알려지지 않은 resultCode" 라고 표시된다.


전달해 주는 JSON 스트링 값을 모두 다 받아서 처리해야 한다는 규칙이 없다면 내가 필요한 값만 ConstraintData 클래스에 정의하여 바인드 시키면 될 것이다.

그러기 위해선 다음과 같이 두 가지 방법을 사용하면 된다. 


첫 번째는 ObjectMapper 클래스를 초기화 한 후 다음의 설정을 추가

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);


두 번째는 ConstraintData 클래스에 다음의 annotation을 추가

@JsonIgnoreProperties(ignoreUnknown = true)


댓글
  • 프로필사진 센텀의 등대지기 jackson 1.9x 이하에서는 DeserializationConfig로 참조하시고
    jackson 2.0x 이상에서는 DeserializationFeature 에서 참조하시면 됩니다~!
    좋은 정보 잘 보고 가요!
    2020.06.17 17:40
  • 프로필사진 목표를 위해 네~ 답변 감사합니다.
    버전이 올라가면서 사용하는 클래스가 변경되었군요.
    2020.06.24 19:08 신고
댓글쓰기 폼