카테고리 없음

Super Type Token, TypeReference, Generic, Type Erasure, ObjectMapper

devwriter 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>>() {});