diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java index 185a151d99..8beb63c14c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java @@ -20,7 +20,6 @@ import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJacksonValue; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; @@ -28,9 +27,10 @@ import org.springframework.http.server.ServerHttpResponse; /** * A convenient base class for {@code ResponseBodyAdvice} implementations * that customize the response before JSON serialization with - * {@link MappingJackson2HttpMessageConverter}. + * {@link AbstractJackson2HttpMessageConverter}'s concrete subclasses. * * @author Rossen Stoyanchev + * @author Sebastien Deleuze * @since 4.1 */ public abstract class AbstractMappingJacksonResponseBodyAdvice implements ResponseBodyAdvice { 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 146c3f1afc..02797b1f10 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 @@ -38,6 +38,7 @@ import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; +import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.util.MultiValueMap; @@ -64,6 +65,7 @@ import static org.junit.Assert.*; *

Also see {@link RequestResponseBodyMethodProcessorMockTests}. * * @author Rossen Stoyanchev + * @author Sebastien Deleuze */ public class RequestResponseBodyMethodProcessorTests { @@ -303,7 +305,7 @@ public class RequestResponseBodyMethodProcessorTests { } @Test - public void jacksonJsonViewWithResponseBody() throws Exception { + public void jacksonJsonViewWithResponseBodyAndJsonMessageConverter() throws Exception { Method method = JacksonViewController.class.getMethod("handleResponseBody"); HandlerMethod handlerMethod = new HandlerMethod(new JacksonViewController(), method); MethodParameter methodReturnType = handlerMethod.getReturnType(); @@ -324,7 +326,7 @@ public class RequestResponseBodyMethodProcessorTests { } @Test - public void jacksonJsonViewWithResponseEntity() throws Exception { + public void jacksonJsonViewWithResponseEntityAndJsonMessageConverter() throws Exception { Method method = JacksonViewController.class.getMethod("handleResponseEntity"); HandlerMethod handlerMethod = new HandlerMethod(new JacksonViewController(), method); MethodParameter methodReturnType = handlerMethod.getReturnType(); @@ -344,6 +346,52 @@ public class RequestResponseBodyMethodProcessorTests { assertTrue(content.contains("\"withoutView\":\"without\"")); } + // SPR-12149 + + @Test + public void jacksonJsonViewWithResponseBodyAndXmlMessageConverter() throws Exception { + Method method = JacksonViewController.class.getMethod("handleResponseBody"); + HandlerMethod handlerMethod = new HandlerMethod(new JacksonViewController(), method); + MethodParameter methodReturnType = handlerMethod.getReturnType(); + + List> converters = new ArrayList>(); + converters.add(new MappingJackson2XmlHttpMessageConverter()); + + RequestResponseBodyMethodProcessor processor = new RequestResponseBodyMethodProcessor( + converters, null, Arrays.asList(new JsonViewResponseBodyAdvice())); + + Object returnValue = new JacksonViewController().handleResponseBody(); + processor.handleReturnValue(returnValue, methodReturnType, this.mavContainer, this.webRequest); + + String content = this.servletResponse.getContentAsString(); + assertFalse(content.contains("with")); + assertTrue(content.contains("with")); + assertTrue(content.contains("without")); + } + + // SPR-12149 + + @Test + public void jacksonJsonViewWithResponseEntityAndXmlMessageConverter() throws Exception { + Method method = JacksonViewController.class.getMethod("handleResponseEntity"); + HandlerMethod handlerMethod = new HandlerMethod(new JacksonViewController(), method); + MethodParameter methodReturnType = handlerMethod.getReturnType(); + + List> converters = new ArrayList>(); + converters.add(new MappingJackson2XmlHttpMessageConverter()); + + HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor( + converters, null, Arrays.asList(new JsonViewResponseBodyAdvice())); + + Object returnValue = new JacksonViewController().handleResponseEntity(); + processor.handleReturnValue(returnValue, methodReturnType, this.mavContainer, this.webRequest); + + String content = this.servletResponse.getContentAsString(); + assertFalse(content.contains("with")); + assertTrue(content.contains("with")); + assertTrue(content.contains("without")); + } + public String handle( @RequestBody List list,