Spring RESTTemplate을 사용한 제네릭
다음과 같은 수업이 있습니다.
public class Wrapper<T> {
private String message;
private T data;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
다음과 같이 resttemplate을 사용합니다.
...
Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap);
Model model = response.getData();
...
그러나 다음을 던집니다.
ClassCastException
나는 그것을 읽었다 : Java에서 Jackson을 사용하려고 할 때 문제가 있지만 도움이되지 않았습니다. 내 문제 등과 관련된 몇 가지 주제가 있습니다. https://jira.springsource.org/browse/SPR-7002 및 https://jira.springsource.org/browse/SPR-7023
어떤 아이디어?
추신 : 내 오류는 다음과 같습니다.
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model
resttemplate은 내 일반 변수를 이해할 수 없으며 일반 T 대신 Object로 받아 들일 수 있습니다. 따라서 LinkedHashMap이됩니다. 여기 에서 읽을 수 있습니다 . 마샬링하는 것을 설명 할 때 다음과 같이 말합니다.
JSON 유형 | 자바 유형
개체 | LinkedHashMap
ParameterizedTypeReference는이 문제를 해결하기 위해 3.2 M2에 도입되었습니다.
Wrapper<Model> response = restClient.exchange(loginUrl,
HttpMethod.GET,
null,
new ParameterizedTypeReference<Wrapper<Model>>() {}).getBody();
그러나 postForObject / getForObject 변형은 도입되지 않았습니다.
내가 할 수있는 유일한 일은 Wrapper를 확장하고 모델을 제네릭으로 사용하는 새 클래스를 만드는 것입니다.
class WrapperWithModel extends Wrapper<Model>{};
WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);
최선의 해결책은 아니지만 적어도 수동으로 응답을 역 정렬화할 필요는 없습니다.
RestTemplate과 함께 제네릭을 사용하지 마십시오. 제네릭을 숨길 래퍼 개체로 요청 및 응답 개체를 래핑합니다.
참조 URL : https://stackoverflow.com/questions/8108887/generics-with-spring-resttemplate
'developer tip' 카테고리의 다른 글
Git에서 사용하는 용어 (0) | 2020.12.15 |
---|---|
현재 날짜를 epoch 타임 스탬프로 변환하는 방법은 무엇입니까? (0) | 2020.12.15 |
IE8 CSS @ font-face 글꼴은 콘텐츠가 끝나기 전, 가끔 새로 고침 / 하드 새로 고침시에만 작동합니다. (0) | 2020.12.15 |
자바 스크립트 연관 배열의 길이 (0) | 2020.12.15 |
Spring은 Map Bean을 autowire 할 수 없습니다. (0) | 2020.12.15 |