-
Super Type Token, TypeReference, Generic, Type Erasure, ObjectMapper카테고리 없음 2023. 2. 18. 22:54
Jackson 을 이용해서 ObjectMapping 을 할 때 generic 일 경우는 TypeRefernce 를 사용합니다.
런타임에 generic 정보는 사라집니다.
그래서 generic 타입으로 ObjectMapping 을 시도할 경우 generic 정보가 사라져서 문제가 발생합니다.
@Data public class Sample { private String name; private int age; } List<Sample> list = objectMapper.readValue(jsonString, List.class);
위 코드는 정상 동작하지만 list 에 들어 있는 요소들은 Sample 인스턴스가 아닙니다.
이를 해결하기 위해서는 TypeRefernce 를 이용하면 됩니다.
@Data public class Sample { private String name; private int age; } List<Sample> list = objectMapper.readValue(jsonString, new TypeRefernce<List<Person>>() {});
list의 요소는 정상적으로 Sample 인스턴스입니다.
이는 ObjectMapper를 이용하는 RestTemplate 에서도 마찬가지 입니다.
restTemplate.getForObject(url, Map.class); => restTemplate.getForObject(url, new TypeReference<Map<String, String>>() {});