SPR-6976 - Add debug log for HttpMessageConverter usage

This commit is contained in:
Arjen Poutsma 2010-03-12 17:46:50 +00:00
parent 5a8aa53232
commit 4880d1d461
5 changed files with 47 additions and 7 deletions

View File

@ -860,6 +860,14 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
for (HttpMessageConverter messageConverter : getMessageConverters()) { for (HttpMessageConverter messageConverter : getMessageConverters()) {
if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
messageConverter.write(returnValue, acceptedMediaType, outputMessage); messageConverter.write(returnValue, acceptedMediaType, outputMessage);
if (logger.isDebugEnabled()) {
MediaType contentType = outputMessage.getHeaders().getContentType();
if (contentType == null) {
contentType = acceptedMediaType;
}
logger.debug("Written [" + returnValue + "] as \"" + contentType +
"\" using [" + messageConverter + "]");
}
this.responseArgumentUsed = true; this.responseArgumentUsed = true;
return; return;
} }

View File

@ -549,6 +549,10 @@ public class HandlerMethodInvoker {
for (HttpMessageConverter<?> messageConverter : this.messageConverters) { for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes()); allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());
if (messageConverter.canRead(paramType, contentType)) { if (messageConverter.canRead(paramType, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + paramType.getName() + "] as \"" + contentType
+"\" using [" + messageConverter + "]");
}
return messageConverter.read(paramType, inputMessage); return messageConverter.read(paramType, inputMessage);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2009 the original author or authors. * Copyright 2002-2010 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,6 +19,9 @@ package org.springframework.web.client;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
@ -38,15 +41,22 @@ public class HttpMessageConverterExtractor<T> implements ResponseExtractor<T> {
private final List<HttpMessageConverter<?>> messageConverters; private final List<HttpMessageConverter<?>> messageConverters;
private final Log logger;
/** /**
* Creates a new instance of the {@code HttpMessageConverterExtractor} with the given response type and message * Creates a new instance of the {@code HttpMessageConverterExtractor} with the given response type and message
* converters. The given converters must support the response type. * converters. The given converters must support the response type.
*/ */
public HttpMessageConverterExtractor(Class<T> responseType, List<HttpMessageConverter<?>> messageConverters) { public HttpMessageConverterExtractor(Class<T> responseType, List<HttpMessageConverter<?>> messageConverters) {
this(responseType, messageConverters, LogFactory.getLog(HttpMessageConverterExtractor.class));
}
HttpMessageConverterExtractor(Class<T> responseType, List<HttpMessageConverter<?>> messageConverters, Log logger) {
Assert.notNull(responseType, "'responseType' must not be null"); Assert.notNull(responseType, "'responseType' must not be null");
Assert.notEmpty(messageConverters, "'messageConverters' must not be empty"); Assert.notEmpty(messageConverters, "'messageConverters' must not be empty");
this.responseType = responseType; this.responseType = responseType;
this.messageConverters = messageConverters; this.messageConverters = messageConverters;
this.logger = logger;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -57,6 +67,10 @@ public class HttpMessageConverterExtractor<T> implements ResponseExtractor<T> {
} }
for (HttpMessageConverter messageConverter : messageConverters) { for (HttpMessageConverter messageConverter : messageConverters) {
if (messageConverter.canRead(responseType, contentType)) { if (messageConverter.canRead(responseType, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + responseType.getName() + "] as \"" + contentType
+"\" using [" + messageConverter + "]");
}
return (T) messageConverter.read(this.responseType, response); return (T) messageConverter.read(this.responseType, response);
} }
} }

View File

@ -188,21 +188,21 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException { public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException {
AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor<T> responseExtractor = HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
} }
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException { public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException {
AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor<T> responseExtractor = HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
} }
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException { public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {
AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor<T> responseExtractor = HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.GET, requestCallback, responseExtractor); return execute(url, HttpMethod.GET, requestCallback, responseExtractor);
} }
@ -268,7 +268,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
throws RestClientException { throws RestClientException {
HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType); HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType);
HttpMessageConverterExtractor<T> responseExtractor = HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables);
} }
@ -276,7 +276,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
throws RestClientException { throws RestClientException {
HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType); HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType);
HttpMessageConverterExtractor<T> responseExtractor = HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables);
} }
@ -509,6 +509,9 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
} }
if (!allSupportedMediaTypes.isEmpty()) { if (!allSupportedMediaTypes.isEmpty()) {
MediaType.sortBySpecificity(allSupportedMediaTypes); MediaType.sortBySpecificity(allSupportedMediaTypes);
if (logger.isDebugEnabled()) {
logger.debug("Setting request Accept header to " + allSupportedMediaTypes);
}
request.getHeaders().setAccept(allSupportedMediaTypes); request.getHeaders().setAccept(allSupportedMediaTypes);
} }
} }
@ -565,6 +568,16 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
if (!requestHeaders.isEmpty()) { if (!requestHeaders.isEmpty()) {
httpRequest.getHeaders().putAll(requestHeaders); httpRequest.getHeaders().putAll(requestHeaders);
} }
if (logger.isDebugEnabled()) {
if (requestContentType != null) {
logger.debug("Writing [" + requestBody + "] as \"" + requestContentType +
"\" using [" + messageConverter + "]");
}
else {
logger.debug("Writing [" + requestBody + "] using [" + messageConverter + "]");
}
}
messageConverter.write(requestBody, requestContentType, httpRequest); messageConverter.write(requestBody, requestContentType, httpRequest);
return; return;
} }
@ -588,7 +601,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations {
public HttpEntityResponseExtractor(Class<T> responseType) { public HttpEntityResponseExtractor(Class<T> responseType) {
if (responseType != null) { if (responseType != null) {
this.delegate = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters()); this.delegate = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
} else { } else {
this.delegate = null; this.delegate = null;
} }

View File

@ -192,6 +192,7 @@ public class RestTemplateIntegrationTests {
public void exchangePost() throws Exception { public void exchangePost() throws Exception {
HttpHeaders requestHeaders = new HttpHeaders(); HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("MyHeader", "MyValue"); requestHeaders.set("MyHeader", "MyValue");
requestHeaders.setContentType(MediaType.TEXT_PLAIN);
HttpEntity<String> requestEntity = new HttpEntity<String>(helloWorld, requestHeaders); HttpEntity<String> requestEntity = new HttpEntity<String>(helloWorld, requestHeaders);
HttpEntity<?> result = template.exchange(URI + "/{method}", HttpMethod.POST, requestEntity, null, "post"); HttpEntity<?> result = template.exchange(URI + "/{method}", HttpMethod.POST, requestEntity, null, "post");
assertEquals("Invalid location", new URI(URI + "/post/1"), result.getHeaders().getLocation()); assertEquals("Invalid location", new URI(URI + "/post/1"), result.getHeaders().getLocation());