From 5675046cb78ffc960eae4f85d7f33637ee480733 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 2 Mar 2010 09:52:43 +0000 Subject: [PATCH] SPR-6876 - RequestMethod does not appear to factor into @RequestMapping uniqueness in some cases --- .../handler/AbstractUrlHandlerMapping.java | 19 ++++++++-- ...plateServletAnnotationControllerTests.java | 35 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java index 4866a1a2b0..e1b77f1867 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java @@ -22,6 +22,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Comparator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -257,8 +258,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { } } String bestPatternMatch = null; + Comparator patternComparator = getPathMatcher().getPatternComparator(urlPath); if (!matchingPatterns.isEmpty()) { - Collections.sort(matchingPatterns, getPathMatcher().getPatternComparator(urlPath)); + Collections.sort(matchingPatterns, patternComparator); if (logger.isDebugEnabled()) { logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns); } @@ -273,8 +275,19 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { } validateHandler(handler, request); String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPatternMatch, urlPath); - Map uriTemplateVariables = - getPathMatcher().extractUriTemplateVariables(bestPatternMatch, urlPath); + + // There might be multiple 'best patterns', let's make sure we have the correct URI template variables + // for all of them + Map uriTemplateVariables = new LinkedHashMap(); + for (String matchingPattern : matchingPatterns) { + if (patternComparator.compare(bestPatternMatch, matchingPattern) == 0) { + uriTemplateVariables + .putAll(getPathMatcher().extractUriTemplateVariables(matchingPattern, urlPath)); + } + } + if (logger.isDebugEnabled()) { + logger.debug("URI Template variables for request [" + urlPath + "] are " + uriTemplateVariables); + } return buildPathExposingHandler(handler, bestPatternMatch, pathWithinMapping, uriTemplateVariables); } // No handler found... diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/UriTemplateServletAnnotationControllerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/UriTemplateServletAnnotationControllerTests.java index 8b0ca88b60..fcede5bb96 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/UriTemplateServletAnnotationControllerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/UriTemplateServletAnnotationControllerTests.java @@ -321,6 +321,25 @@ public class UriTemplateServletAnnotationControllerTests { assertEquals("M5", response.getContentAsString()); } + /* + * See SPR-6876 + */ + @Test + public void variableNames() throws Exception { + initServlet(VariableNamesController.class); + + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test/foo"); + MockHttpServletResponse response = new MockHttpServletResponse(); + servlet.service(request, response); + assertEquals("foo-foo", response.getContentAsString()); + + request = new MockHttpServletRequest("DELETE", "/test/bar"); + response = new MockHttpServletResponse(); + servlet.service(request, response); + assertEquals("bar-bar", response.getContentAsString()); + + } + /* * Controllers @@ -555,5 +574,21 @@ public class UriTemplateServletAnnotationControllerTests { } } + @Controller + @RequestMapping("/test") + public static class VariableNamesController { + + @RequestMapping(value = "/{foo}", method=RequestMethod.GET) + public void foo(@PathVariable String foo, Writer writer) throws IOException { + writer.write("foo-" + foo); + } + + @RequestMapping(value = "/{bar}", method=RequestMethod.DELETE) + public void bar(@PathVariable String bar, Writer writer) throws IOException { + writer.write("bar-" + bar); + } + } + + }