RestTemplate은 어떻게 response Object를 DataType 로 변환하는가
원래 그 데이터 타입으로는 캐스팅 가능
1
2
3
4
5
6
7
8
9
10
@Test
fun `테스트`() {
val obj: Object = Coffee("id", "name") as Object
val coffee: Coffee = obj as Coffee
// 이건 원래 그 데이터가 Coffee라서 가능
val obj2: Object = Object()
val coffee2: Coffee = obj2 as Coffee
// 이건 불가능. id 속성이랑 name 속성이 없으니까 당연 불가능하다
}
RestTemplate의 response Object -> T type casting 과정
- RestTemplate도 내부적으로는
(T)
캐스팅을 이용하게 되는데 extractData()
에서 비검사 형변환 경고를 제어하기 위해@SuppressWarnings
로 경고를 억제해준다.
1
2
3
4
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public T extractData(ClientHttpResponse response) throws IOException {
...
return (T) genericMessageConverter.read(this.responseType, null, responseWrapper);
- genericMessageConverter는 인터페이스
- jackson을 사용시 MappingJackson2HttpMessageConverter를 구현체로 사용하게 됨
- jackson은
ObjectMapper.read()
를 이용하게 됨. - ObjectMapper.read() 와 그 안의 메서드를 실행하면서 type 정보가 일치하는지 보는 것 같다
- Type 별로 다른 Deserializer를 사용하는 것 같은데
findRootDeserializer()
같은 메서드를 호출하는걸로 봐서는 context 상에서 Deserializer를 찾고, 없으면 새로 만드는 듯.
- Type 별로 다른 Deserializer를 사용하는 것 같은데
- jackson deserialize mapping 기준에 대해서는 [Java] Jackson ObjectMapper Serialization 참고
- jackson은
This post is licensed under CC BY 4.0 by the author.