스프링 REST 템플릿 포함 제네릭
나는 그런 수업을 듣는다.
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
읽었어요.Jackson을 java에서 사용하려고 할 때 문제가 발생하지만 도움이 되지 않습니다.제 문제 등에 관한 몇 가지 주제가 있습니다.: https://jira.springsource.org/browse/SPR-7002 및 https://jira.springsource.org/browse/SPR-7023
좋은 생각 있어요?
PS: 제 오류는 다음과 같습니다.
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model
resttemplate는 내 범용 변수를 이해하지 못하고 범용 T가 아닌 오브젝트로 받아들일 수 있습니다.따라서 Linked Hash Map이 됩니다.여기서 읽을 수 있습니다.설명할 때 다음과 같이 되어 있습니다.
JSON 타입 | Java 타입
object | Linked Hash Map
Parameterized Type Reference는 이 문제를 회피하기 위해 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
'programing' 카테고리의 다른 글
| WooCommerce에서만 현재 제품의 제품 태그를 가져옵니다. (0) | 2023.03.31 |
|---|---|
| Airbnb 스타일 가이드는 왜 함수 이름 추론에 의존하지 말라고 하는가? (0) | 2023.03.26 |
| Oracle의 null 문자열과 빈 문자열 비교 (0) | 2023.03.26 |
| 정의되지 않은 함수 create_function 호출 (0) | 2023.03.26 |
| 갤러리 쇼트코드에서_post_thumbnail 제외 (0) | 2023.03.26 |