diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index a6afb1669ae..79e36bb4fdd 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -860,6 +860,14 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator for (HttpMessageConverter messageConverter : getMessageConverters()) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { 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; return; } diff --git a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java index c5649ce2c85..1d043498fc8 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java +++ b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java @@ -549,6 +549,10 @@ public class HandlerMethodInvoker { for (HttpMessageConverter messageConverter : this.messageConverters) { allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes()); if (messageConverter.canRead(paramType, contentType)) { + if (logger.isDebugEnabled()) { + logger.debug("Reading [" + paramType.getName() + "] as \"" + contentType + +"\" using [" + messageConverter + "]"); + } return messageConverter.read(paramType, inputMessage); } } 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 index c5de56acdd6..01e4877ed49 100644 --- 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 @@ -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"); * 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.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.HttpMessageConverter; @@ -38,15 +41,22 @@ public class HttpMessageConverterExtractor implements ResponseExtractor { private final List> messageConverters; + private final Log logger; + /** * 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) { + this(responseType, messageConverters, LogFactory.getLog(HttpMessageConverterExtractor.class)); + } + + HttpMessageConverterExtractor(Class responseType, List> messageConverters, Log logger) { Assert.notNull(responseType, "'responseType' must not be null"); Assert.notEmpty(messageConverters, "'messageConverters' must not be empty"); this.responseType = responseType; this.messageConverters = messageConverters; + this.logger = logger; } @SuppressWarnings("unchecked") @@ -57,6 +67,10 @@ public class HttpMessageConverterExtractor implements ResponseExtractor { } for (HttpMessageConverter messageConverter : messageConverters) { if (messageConverter.canRead(responseType, contentType)) { + if (logger.isDebugEnabled()) { + logger.debug("Reading [" + responseType.getName() + "] as \"" + contentType + +"\" using [" + messageConverter + "]"); + } return (T) messageConverter.read(this.responseType, response); } } 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 6a65db1a340..19fa94c4164 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 @@ -188,21 +188,21 @@ public class RestTemplate extends HttpAccessor implements RestOperations { public T getForObject(String url, Class responseType, Object... urlVariables) throws RestClientException { AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor responseExtractor = - new HttpMessageConverterExtractor(responseType, getMessageConverters()); + new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); } public T getForObject(String url, Class responseType, Map urlVariables) throws RestClientException { AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor responseExtractor = - new HttpMessageConverterExtractor(responseType, getMessageConverters()); + new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); } public T getForObject(URI url, Class responseType) throws RestClientException { AcceptHeaderRequestCallback requestCallback = new AcceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor responseExtractor = - new HttpMessageConverterExtractor(responseType, getMessageConverters()); + new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor); } @@ -268,7 +268,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations { throws RestClientException { HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = - new HttpMessageConverterExtractor(responseType, getMessageConverters()); + new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); } @@ -276,7 +276,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations { throws RestClientException { HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = - new HttpMessageConverterExtractor(responseType, getMessageConverters()); + new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); } @@ -509,6 +509,9 @@ public class RestTemplate extends HttpAccessor implements RestOperations { } if (!allSupportedMediaTypes.isEmpty()) { MediaType.sortBySpecificity(allSupportedMediaTypes); + if (logger.isDebugEnabled()) { + logger.debug("Setting request Accept header to " + allSupportedMediaTypes); + } request.getHeaders().setAccept(allSupportedMediaTypes); } } @@ -565,6 +568,16 @@ public class RestTemplate extends HttpAccessor implements RestOperations { if (!requestHeaders.isEmpty()) { 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); return; } @@ -588,7 +601,7 @@ public class RestTemplate extends HttpAccessor implements RestOperations { public HttpEntityResponseExtractor(Class responseType) { if (responseType != null) { - this.delegate = new HttpMessageConverterExtractor(responseType, getMessageConverters()); + this.delegate = new HttpMessageConverterExtractor(responseType, getMessageConverters(), logger); } else { this.delegate = null; } diff --git a/org.springframework.web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java b/org.springframework.web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java index 20268b3b1ce..ae4a8370d98 100644 --- a/org.springframework.web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java +++ b/org.springframework.web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java @@ -192,6 +192,7 @@ public class RestTemplateIntegrationTests { public void exchangePost() throws Exception { HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("MyHeader", "MyValue"); + requestHeaders.setContentType(MediaType.TEXT_PLAIN); HttpEntity requestEntity = new HttpEntity(helloWorld, requestHeaders); HttpEntity result = template.exchange(URI + "/{method}", HttpMethod.POST, requestEntity, null, "post"); assertEquals("Invalid location", new URI(URI + "/post/1"), result.getHeaders().getLocation());