From 7c1a2f37f28142f464711e560daf2765c0010ad7 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 12 Oct 2012 09:20:55 -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. --- .../AbstractMessageConverterMethodProcessor.java | 2 +- .../RequestResponseBodyMethodProcessorTests.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index ceca4efdf6..ab91e91483 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -193,7 +193,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/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java index bca0175866..bac2add578 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java @@ -315,6 +315,21 @@ 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")); + } + + @ResponseBody public String handle1(@RequestBody String s, int i) { return s;