From 76abf7707753adabe17331d5806a4cd300e6bd58 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 17 May 2011 13:02:48 +0000 Subject: [PATCH] Use request attribute to check producible media types when writing to the response body git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4314 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../web/servlet/HandlerMapping.java | 8 +++ .../RequestMappingHandlerMapping.java | 13 +++- ...stractMessageConverterMethodProcessor.java | 71 +++++++++---------- .../support/HttpEntityMethodProcessor.java | 5 +- .../RequestResponseBodyMethodProcessor.java | 10 ++- .../HttpEntityMethodProcessorTests.java | 7 +- ...questResponseBodyMethodProcessorTests.java | 4 +- 7 files changed, 68 insertions(+), 50 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/HandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/HandlerMapping.java index c95e6ede0f9..8c381b6c469 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/HandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/HandlerMapping.java @@ -92,6 +92,14 @@ public interface HandlerMapping { */ String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables"; + /** + * Name of the {@link HttpServletRequest} attribute that contains the set of producible MediaTypes + * applicable to the mapped handler. + *

Note: This attribute is not required to be supported by all HandlerMapping implementations. + * Handlers should not necessarily expect this request attribute to be present in all scenarios. + */ + String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes"; + /** * Return a handler and any interceptors for this request. The choice may be made * on request URL, session state, or any factor the implementing class chooses. diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java index c8611a31f8c..10eda4812f4 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; + import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -173,11 +174,17 @@ public class RequestMappingHandlerMapping extends AbstractHandlerMethodMapping uriTemplateVariables = pathMatcher.extractUriTemplateVariables(pattern, lookupPath); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVariables); + + Set mediaTypes = info.getProduces().getMediaTypes(); + if (mediaTypes.size() > 1 || !MediaType.ALL.equals(mediaTypes.iterator().next())) { + request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, mediaTypes); + } } /** diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/AbstractMessageConverterMethodProcessor.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/AbstractMessageConverterMethodProcessor.java index 127ad0ee696..4e714e6eb2f 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/AbstractMessageConverterMethodProcessor.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/AbstractMessageConverterMethodProcessor.java @@ -17,18 +17,17 @@ package org.springframework.web.servlet.mvc.method.annotation.support; import java.io.IOException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.core.MethodParameter; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; @@ -37,12 +36,13 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.HttpMediaTypeNotSupportedException; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.HandlerMapping; /** * A base class for resolving method argument values by reading from the body of a request with {@link @@ -124,22 +124,43 @@ public abstract class AbstractMessageConverterMethodProcessor * @return the output message */ protected HttpOutputMessage createOutputMessage(NativeWebRequest webRequest) { - HttpServletResponse servletResponse = webRequest.getNativeResponse(HttpServletResponse.class); - return new ServletServerHttpResponse(servletResponse); + HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class); + return new ServletServerHttpResponse(response); + } + + /** + * Returns the media types that can be produced: + *