Browse Source

Null-safe handling of response type in AcceptHeaderRequestCallback

Issue: SPR-16690
pull/1811/merge
Juergen Hoeller 7 years ago
parent
commit
44cf002c00
  1. 23
      spring-web/src/main/java/org/springframework/web/client/RestTemplate.java

23
spring-web/src/main/java/org/springframework/web/client/RestTemplate.java

@ -831,17 +831,15 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @@ -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<MediaType> allSupportedMediaTypes = getMessageConverters().stream()
.filter(converter -> canReadResponse(responseClass, converter))
List<MediaType> 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 @@ -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 @@ -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 @@ -1013,7 +1010,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
private static class HeadersExtractor implements ResponseExtractor<HttpHeaders> {
@Override
public HttpHeaders extractData(ClientHttpResponse response) throws IOException {
public HttpHeaders extractData(ClientHttpResponse response) {
return response.getHeaders();
}
}

Loading…
Cancel
Save