다른 유형의 DTO와 함께 사용할 일반 REST 클라이언트를 작성하고 있습니다.
public abstract class GenericClient<DTO> {
private final Class<DTO> dtoClass;
... ctor which sets dtoClass ...
public DTO getOne(String id) {
...
URI uri = ...
ResponseEntity<DTO> exchange = getRestTemplate()
.exchange(uri, HttpMethod.GET, entity, dtoClass);
return exchange.getBody(); // works
}
public List<DTO> findAll() {
...
URI uri = ...
ResponseEntity<List<DTO>> exchange = getRestTemplate()
.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {});
return exchange.getBody(); // fails with ClassCastException
}
}
이것은 다음과 같은 여러 구체적인 클라이언트에 의해 구현됩니다.
public class OneActualDTOClient extends GenericClient<OneActualDTO> {
public OneActualDTOClient(){
super(OneActualDTO.class);
}
}
이것은 컴파일되고 getOne
방법은 잘 작동합니다. 그러나 findAll
런타임에 유형 매개 변수 DTO를 사용할 exchange
수 없으므로 메서드는 들어오는 JSON을 직렬화 해제 할 수 없습니다 (내가 이해하는 한).
보시다시피, Class<DTO>
단일 요소 ( getOne
)에 대한 교환과 함께 사용할 구체적인 DTO 클래스 ( )를 전달합니다 .
ParameterizedTypeReference를 exchange
메서드에 전달하여 런타임에 반환되는 것을 List<OneActualDTO>
어떻게 알 수 있습니까?
그래서 다음과 같이 사용자 정의 getType
를 ParameterizedTypeReference
반환하는 방법 을 재정의하는 해결책을 찾았습니다 ParameterizedType
.
public abstract class GenericClient<DTO> {
private final Class<DTO> dtoClass;
... ctor which sets dtoClass ...
public List<DTO> findAll() {
...
URI uri = ...
ResponseEntity<List<DTO>> exchange = getRestTemplate()
.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {
@Override
public Type getType() {
return new ParameterizedType() {
@Override
public Type getRawType() {
return List.class;
}
@Override
public Type getOwnerType() {
return null;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[]{dtoClass};
}
};
});
return exchange.getBody(); // OK
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다