From 44cf002c00228e0a7abd7aa2152702deeb561cf3 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 27 Apr 2018 18:24:59 +0200 Subject: [PATCH] Null-safe handling of response type in AcceptHeaderRequestCallback Issue: SPR-16690 --- .../web/client/RestTemplate.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index abaa231784..7cd9f79cf8 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -831,17 +831,15 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Nullable private final Type responseType; - private AcceptHeaderRequestCallback(@Nullable Type responseType) { + public AcceptHeaderRequestCallback(@Nullable Type responseType) { this.responseType = responseType; } @Override public void doWithRequest(ClientHttpRequest request) throws IOException { if (this.responseType != null) { - final Class responseClass = (this.responseType instanceof Class) ? - (Class) this.responseType : null; - final List allSupportedMediaTypes = getMessageConverters().stream() - .filter(converter -> canReadResponse(responseClass, converter)) + List allSupportedMediaTypes = getMessageConverters().stream() + .filter(converter -> canReadResponse(this.responseType, converter)) .flatMap(this::getSupportedMediaTypes) .distinct() .sorted(MediaType.SPECIFICITY_COMPARATOR) @@ -853,15 +851,14 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } } - private boolean canReadResponse(@Nullable Class responseClass, HttpMessageConverter converter) { + private boolean canReadResponse(Type responseType, HttpMessageConverter converter) { + Class responseClass = (responseType instanceof Class ? (Class) responseType : null); if (responseClass != null) { return converter.canRead(responseClass, null); } else if (converter instanceof GenericHttpMessageConverter) { - GenericHttpMessageConverter genericConverter = - (GenericHttpMessageConverter) converter; - return genericConverter - .canRead(this.responseType, null, null); + GenericHttpMessageConverter genericConverter = (GenericHttpMessageConverter) converter; + return genericConverter.canRead(responseType, null, null); } return false; } @@ -886,11 +883,11 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat private final HttpEntity requestEntity; - private HttpEntityRequestCallback(@Nullable Object requestBody) { + public HttpEntityRequestCallback(@Nullable Object requestBody) { this(requestBody, null); } - private HttpEntityRequestCallback(@Nullable Object requestBody, @Nullable Type responseType) { + public HttpEntityRequestCallback(@Nullable Object requestBody, @Nullable Type responseType) { super(responseType); if (requestBody instanceof HttpEntity) { this.requestEntity = (HttpEntity) requestBody; @@ -1013,7 +1010,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat private static class HeadersExtractor implements ResponseExtractor { @Override - public HttpHeaders extractData(ClientHttpResponse response) throws IOException { + public HttpHeaders extractData(ClientHttpResponse response) { return response.getHeaders(); } }