ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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>>() {});
Designed by Tistory.