From 96b418cc8ae537e985cfe67b80cd866d03c8060f Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 3 Jan 2014 23:29:12 +0100 Subject: [PATCH] Make RequestMappingHandlerMapping xml config easier Prior to this commit, it was necessary to override the HandlerMapping definition to change properties like useSuffixPatternMatch, useSuffixPatternMatch... This commits adds new attributes on the mvc:annotation-driven XML tag that allows to configure such flags: * use-suffix-pattern-match * use-trailing-slash-match * use-registered-suffix-pattern-match Issue: SPR-10163 --- .../AnnotationDrivenBeanDefinitionParser.java | 13 ++++++++ .../web/servlet/config/spring-mvc-4.0.xsd | 29 ++++++++++++++++ ...tationDrivenBeanDefinitionParserTests.java | 33 ++++++++++++++++--- ...mvc-config-content-negotiation-manager.xml | 3 +- .../config/mvc-config-custom-attributes.xml | 13 ++++++++ 5 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-custom-attributes.xml diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 7b4ceef94f..917f329615 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -171,6 +171,19 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { Boolean enableMatrixVariables = Boolean.valueOf(element.getAttribute("enableMatrixVariables")); handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables); } + if(element.hasAttribute("use-suffix-pattern-match")) { + handlerMappingDef.getPropertyValues().add("useSuffixPatternMatch", + Boolean.valueOf(element.getAttribute("use-suffix-pattern-match"))); + } + if(element.hasAttribute("use-trailing-slash-match")) { + handlerMappingDef.getPropertyValues().add("useTrailingSlashMatch", + Boolean.valueOf(element.getAttribute("use-trailing-slash-match"))); + } + if(element.hasAttribute("use-registered-suffix-pattern-match")) { + handlerMappingDef.getPropertyValues().add("useRegisteredSuffixPatternMatch", + Boolean.valueOf(element.getAttribute("use-registered-suffix-pattern-match"))); + } + RuntimeBeanReference conversionService = getConversionService(element, source, parserContext); RuntimeBeanReference validator = getValidator(element, source, parserContext); diff --git a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.0.xsd b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.0.xsd index 985d54a584..99319837bb 100644 --- a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.0.xsd +++ b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.0.xsd @@ -255,6 +255,35 @@ ]]> + + + + + + + + + + + + + + + diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java index 3f72adf22e..bb78a4d477 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,10 +15,6 @@ */ package org.springframework.web.servlet.config; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - import java.util.List; import org.junit.Before; @@ -42,11 +38,16 @@ import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + /** * Test fixture for the configuration in mvc-config-annotation-driven.xml. * @author Rossen Stoyanchev + * @author Brian Clozel */ public class AnnotationDrivenBeanDefinitionParserTests { @@ -70,6 +71,28 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertEquals(false, new DirectFieldAccessor(adapter).getPropertyValue("ignoreDefaultModelOnRedirect")); } + @Test + public void testCustomContentNegotiationManager() { + loadBeanDefinitions("mvc-config-content-negotiation-manager.xml"); + RequestMappingHandlerMapping hm = appContext.getBean(RequestMappingHandlerMapping.class); + assertNotNull(hm); + assertTrue(hm.useSuffixPatternMatch()); + assertTrue(hm.useRegisteredSuffixPatternMatch()); + List fileExtensions = hm.getContentNegotiationManager().getAllFileExtensions(); + assertThat(fileExtensions, contains("xml")); + assertThat(fileExtensions, hasSize(1)); + } + + @Test + public void testRequestMappingCustomAttributes() { + loadBeanDefinitions("mvc-config-custom-attributes.xml"); + RequestMappingHandlerMapping hm = appContext.getBean(RequestMappingHandlerMapping.class); + assertNotNull(hm); + assertFalse(hm.getUrlPathHelper().shouldRemoveSemicolonContent()); + assertFalse(hm.useTrailingSlashMatch()); + assertFalse(hm.useSuffixPatternMatch()); + } + @Test public void testMessageConverters() { loadBeanDefinitions("mvc-config-message-converters.xml"); diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml index 76fa653957..2f7a1a858a 100644 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml @@ -5,7 +5,8 @@ xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-custom-attributes.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-custom-attributes.xml new file mode 100644 index 0000000000..07c64a54b0 --- /dev/null +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-custom-attributes.xml @@ -0,0 +1,13 @@ + + + + +