From fc3ccd10522dc2c6736e2d73ea7871ea3bdc369a Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Fri, 6 May 2011 19:13:44 +0000 Subject: [PATCH] Expose return-value-handlers in mvc namespace Mirroring the MvcConfigurer#addCustomReturnValueHandlers callback which allows for providing a list of HandlerMethodReturnValueHandler types git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4271 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../AnnotationDrivenBeanDefinitionParser.java | 12 ++++++ .../web/servlet/config/spring-mvc-3.1.xsd | 40 ++++++++++++++----- ...tationDrivenBeanDefinitionParserTests.java | 28 +++++++++++++ .../mvc-config-return-value-handlers.xml | 14 +++++++ 4 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 6cd5ccd52a4..ffbeef954f1 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -124,6 +124,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { ManagedList messageConverters = getMessageConverters(element, source, parserContext); ManagedList argumentResolvers = getArgumentResolvers(element, source, parserContext); + ManagedList returnValueHandlers = getReturnValueHandlers(element, source, parserContext); RootBeanDefinition methodAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class); methodAdapterDef.setSource(source); @@ -133,6 +134,9 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { if (argumentResolvers != null) { methodAdapterDef.getPropertyValues().add("customArgumentResolvers", argumentResolvers); } + if (returnValueHandlers != null) { + methodAdapterDef.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); + } String methodAdapterName = parserContext.getReaderContext().registerWithGeneratedName(methodAdapterDef); RootBeanDefinition csInterceptorDef = new RootBeanDefinition(ConversionServiceExposingInterceptor.class); @@ -228,6 +232,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return null; } + private ManagedList getReturnValueHandlers(Element element, Object source, ParserContext parserContext) { + Element handlersElement = DomUtils.getChildElementByTagName(element, "return-value-handlers"); + if (handlersElement != null) { + return extractBeanSubElements(handlersElement, parserContext); + } + return null; + } + private ManagedList getMessageConverters(Element element, Object source, ParserContext parserContext) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); ManagedList messageConverters = new ManagedList(); diff --git a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd index 0761dea919c..534b2965e4f 100644 --- a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd +++ b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd @@ -1,6 +1,6 @@ - + @@ -60,7 +60,27 @@ + + + + + + + + + + + + + + @@ -101,7 +121,7 @@ @@ -171,10 +191,10 @@ Configures a handler for serving static resources by forwarding to the Servlet container's default Servlet. Use of this handler allows using a "/" mapping with the DispatcherServlet while still utilizing the Servlet container to serve static resources. - This handler will forward all requests to the default Servlet. Therefore it is important that it remains last in the - order of all other URL HandlerMappings. That will be the case if you use the "annotation-driven" element or alternatively - if you are setting up your customized HandlerMapping instance be sure to set its "order" property to a value lower than - that of the DefaultServletHttpRequestHandler, which is Integer.MAX_VALUE. + This handler will forward all requests to the default Servlet. Therefore it is important that it remains last in the + order of all other URL HandlerMappings. That will be the case if you use the "annotation-driven" element or alternatively + if you are setting up your customized HandlerMapping instance be sure to set its "order" property to a value lower than + that of the DefaultServletHttpRequestHandler, which is Integer.MAX_VALUE. ]]> diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java index a83d114283c..076cf6011eb 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java @@ -37,6 +37,7 @@ import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; @@ -96,6 +97,20 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertTrue(resolvers.get(1) instanceof TestHandlerMethodArgumentResolver); } + @SuppressWarnings("unchecked") + @Test + public void testReturnValueHandlers() { + loadBeanDefinitions("mvc-config-return-value-handlers.xml"); + RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); + assertNotNull(adapter); + Object value = new DirectFieldAccessor(adapter).getPropertyValue("customReturnValueHandlers"); + assertNotNull(value); + assertTrue(value instanceof List); + List handlers = (List) value; + assertEquals(1, handlers.size()); + assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(0).getClass()); + } + private void loadBeanDefinitions(String fileName) { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); reader.loadBeanDefinitions(new ClassPathResource(fileName, @@ -141,6 +156,19 @@ class TestHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver } } +class TestHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler { + + public boolean supportsReturnType(MethodParameter returnType) { + return false; + } + + public void handleReturnValue(Object returnValue, + MethodParameter returnType, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest) throws Exception { + } + +} + class TestMessageCodesResolver implements MessageCodesResolver { public String[] resolveMessageCodes(String errorCode, String objectName) { diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml new file mode 100644 index 00000000000..0e095677e08 --- /dev/null +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml @@ -0,0 +1,14 @@ + + + + + + + + + +