diff --git a/org.springframework.web/src/main/java/org/springframework/web/client/HttpMessageConverterExtractor.java b/org.springframework.web/src/main/java/org/springframework/web/client/HttpMessageConverterExtractor.java
new file mode 100644
index 00000000000..7e79cd359fa
--- /dev/null
+++ b/org.springframework.web/src/main/java/org/springframework/web/client/HttpMessageConverterExtractor.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.web.client;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.util.Assert;
+
+/**
+ * Response extractor that uses the given {@linkplain HttpMessageConverter entity converters} to convert the response
+ * into a type T.
+ *
+ * @author Arjen Poutsma
+ * @see RestTemplate
+ * @since 3.0
+ */
+public class HttpMessageConverterExtractor implements ResponseExtractor {
+
+ private final Class responseType;
+
+ private final List> messageConverters;
+
+ /**
+ * Creates a new instance of the {@code HttpMessageConverterExtractor} with the given response type and message
+ * converters. The given converters must support the response type.
+ */
+ public HttpMessageConverterExtractor(Class responseType, List> messageConverters) {
+ Assert.notNull(responseType, "'responseType' must not be null");
+ Assert.notEmpty(messageConverters, "'messageConverters' must not be empty");
+ this.responseType = responseType;
+ this.messageConverters = messageConverters;
+ }
+
+ public T extractData(ClientHttpResponse response) throws IOException {
+ MediaType contentType = response.getHeaders().getContentType();
+ if (contentType == null) {
+ throw new RestClientException("Cannot extract response: no Content-Type found");
+ }
+ for (HttpMessageConverter messageConverter : messageConverters) {
+ for (MediaType supportedMediaType : messageConverter.getSupportedMediaTypes()) {
+ if (supportedMediaType.includes(contentType)) {
+ return messageConverter.read(this.responseType, response);
+ }
+ }
+ }
+ throw new RestClientException(
+ "Could not extract response: no suitable HttpMessageConverter found for response type [" +
+ this.responseType.getName() + "] and content type [" + contentType + "]");
+ }
+
+}
diff --git a/org.springframework.web/src/main/java/org/springframework/web/client/RestTemplate.java b/org.springframework.web/src/main/java/org/springframework/web/client/RestTemplate.java
index feaa6c25352..4024e057603 100644
--- a/org.springframework.web/src/main/java/org/springframework/web/client/RestTemplate.java
+++ b/org.springframework.web/src/main/java/org/springframework/web/client/RestTemplate.java
@@ -166,16 +166,18 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
public T getForObject(String url, Class responseType, String... urlVariables) throws RestClientException {
checkForSupportedMessageConverter(responseType);
+ List> supportedMessageConverters = getSupportedMessageConverters(responseType);
return execute(url, HttpMethod.GET, new GetCallback(responseType),
- new HttpMessageConverterExtractor(responseType), urlVariables);
+ new HttpMessageConverterExtractor(responseType, supportedMessageConverters), urlVariables);
}
public T getForObject(String url, Class responseType, Map urlVariables)
throws RestClientException {
checkForSupportedMessageConverter(responseType);
+ List> supportedMessageConverters = getSupportedMessageConverters(responseType);
return execute(url, HttpMethod.GET, new GetCallback(responseType),
- new HttpMessageConverterExtractor(responseType), urlVariables);
+ new HttpMessageConverterExtractor(responseType, supportedMessageConverters), urlVariables);
}
// HEAD
@@ -381,37 +383,6 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
}
}
- /**
- * Response extractor that uses the registered {@linkplain HttpMessageConverter entity converters}
- * to convert the response into a type T.
- */
- private class HttpMessageConverterExtractor implements ResponseExtractor {
-
- private final Class responseType;
-
- private HttpMessageConverterExtractor(Class responseType) {
- this.responseType = responseType;
- }
-
- public T extractData(ClientHttpResponse response) throws IOException {
- MediaType contentType = response.getHeaders().getContentType();
- if (contentType == null) {
- throw new RestClientException("Cannot extract response: no Content-Type found");
- }
- for (HttpMessageConverter messageConverter : getSupportedMessageConverters(this.responseType)) {
- for (MediaType supportedMediaType : messageConverter.getSupportedMediaTypes()) {
- if (supportedMediaType.includes(contentType)) {
- return messageConverter.read(this.responseType, response);
- }
- }
- }
- throw new RestClientException(
- "Could not extract response: no suitable HttpMessageConverter found for response type [" +
- this.responseType.getName() + "] and content type [" + contentType + "]");
- }
-
- }
-
/** Response extractor that extracts the response {@link HttpHeaders}. */
private static class HeadersExtractor implements ResponseExtractor {