From dc01f088f7cb9a6257503ebce0f0e581eb52eec6 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 12 Oct 2012 08:49:30 -0400 Subject: [PATCH] Fix issue in message conversion This change ensures that when the Accept and the Producible media types are equally specific, we use the one from the Accept header, which may for example carry a different charset. --- ...stractMessageConverterMethodProcessor.java | 2 +- ...tResponseBodyMethodProcessorMockTests.java | 29 ------------------- ...questResponseBodyMethodProcessorTests.java | 15 +++++++++- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index fd0b45c8122..7e37632960b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -196,7 +196,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe */ private MediaType getMostSpecificMediaType(MediaType acceptType, MediaType produceType) { produceType = produceType.copyQualityValue(acceptType); - return MediaType.SPECIFICITY_COMPARATOR.compare(acceptType, produceType) < 0 ? acceptType : produceType; + return MediaType.SPECIFICITY_COMPARATOR.compare(acceptType, produceType) <= 0 ? acceptType : produceType; } } \ No newline at end of file diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java index 0788265b1c3..c74159b0fea 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java @@ -301,35 +301,6 @@ public class RequestResponseBodyMethodProcessorMockTests { verify(messageConverter); } - // SPR-9160 - - @Test - public void handleReturnValueSortByQuality() throws Exception { - this.servletRequest.addHeader("Accept", "text/plain; q=0.5, application/json"); - - List> converters = new ArrayList>(); - converters.add(new MappingJackson2HttpMessageConverter()); - converters.add(new StringHttpMessageConverter()); - RequestResponseBodyMethodProcessor handler = new RequestResponseBodyMethodProcessor(converters); - - handler.writeWithMessageConverters("Foo", returnTypeStringProduces, webRequest); - - assertEquals("application/json;charset=UTF-8", servletResponse.getHeader("Content-Type")); - } - - @Test - public void handleReturnValueString() throws Exception { - List>converters = new ArrayList>(); - converters.add(new ByteArrayHttpMessageConverter()); - converters.add(new StringHttpMessageConverter()); - - processor = new RequestResponseBodyMethodProcessor(converters); - processor.handleReturnValue("Foo", returnTypeString, mavContainer, webRequest); - - assertEquals("text/plain;charset=ISO-8859-1", servletResponse.getHeader("Content-Type")); - assertEquals("Foo", servletResponse.getContentAsString()); - } - @ResponseBody public String handle1(@RequestBody String s, int i) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java index 1a4726e5b09..1dc65237739 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java @@ -143,12 +143,25 @@ public class RequestResponseBodyMethodProcessorTests { assertEquals("Foo", servletResponse.getContentAsString()); } + @Test + public void handleReturnValueStringAcceptCharset() throws Exception { + this.servletRequest.addHeader("Accept", "text/plain;charset=UTF-8"); + + List> converters = new ArrayList>(); + converters.add(new ByteArrayHttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + RequestResponseBodyMethodProcessor processor = new RequestResponseBodyMethodProcessor(converters); + + processor.writeWithMessageConverters("Foo", returnTypeString, webRequest); + + assertEquals("text/plain;charset=UTF-8", servletResponse.getHeader("Content-Type")); + } + public String handle(@RequestBody List list, @RequestBody SimpleBean simpleBean) { return null; } - private static class SimpleBean { private String name;