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 7b4ceef94f0..917f3296155 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 985d54a5846..99319837bb1 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 3f72adf22e5..bb78a4d4771 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 76fa6539570..2f7a1a858a4 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 00000000000..07c64a54b06 --- /dev/null +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-custom-attributes.xml @@ -0,0 +1,13 @@ + + + + +