From ead5df45460972c8a8ad2ee6a429bc440c61ebfa Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 26 Jan 2010 10:47:36 +0000 Subject: [PATCH] SPR-6649 - Request mapping incorrectly receiving all dispatches for a controller --- .../AnnotationMethodHandlerAdapter.java | 2 +- .../ServletAnnotationControllerTests.java | 43 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index a3b0605118..336b5a96e1 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -596,7 +596,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator return null; } String bestMatchingPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); - if (StringUtils.hasText(bestMatchingPattern)) { + if (StringUtils.hasText(bestMatchingPattern) && bestMatchingPattern.endsWith("*")) { String combinedPattern = pathMatcher.combine(bestMatchingPattern, methodLevelPattern); if (!combinedPattern.equals(bestMatchingPattern) && (isPathMatchInternal(combinedPattern, lookupPath))) { diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index 7dcbc5a3b8..0fd7c4674c 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -204,8 +204,20 @@ public class ServletAnnotationControllerTests { @Test public void defaultExpressionParameters() throws Exception { - initServlet(DefaultExpressionValueParamController.class); - + servlet = new DispatcherServlet() { + @Override + protected WebApplicationContext createWebApplicationContext(WebApplicationContext parent) { + GenericWebApplicationContext wac = new GenericWebApplicationContext(); + wac.registerBeanDefinition("controller", new RootBeanDefinition(DefaultExpressionValueParamController.class)); + RootBeanDefinition ppc = new RootBeanDefinition(PropertyPlaceholderConfigurer.class); + ppc.getPropertyValues().add("properties", "myKey=foo"); + wac.registerBeanDefinition("ppc", ppc); + wac.refresh(); + return wac; + } + }; + servlet.init(new MockServletConfig()); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/myApp/myPath.do"); request.setContextPath("/myApp"); MockHttpServletResponse response = new MockHttpServletResponse(); @@ -344,9 +356,6 @@ public class ServletAnnotationControllerTests { protected WebApplicationContext createWebApplicationContext(WebApplicationContext parent) { GenericWebApplicationContext wac = new GenericWebApplicationContext(); wac.registerBeanDefinition("controller", new RootBeanDefinition(controllerClass)); - RootBeanDefinition ppc = new RootBeanDefinition(PropertyPlaceholderConfigurer.class); - ppc.getPropertyValues().add("properties", "myKey=foo"); - wac.registerBeanDefinition("ppc", ppc); wac.refresh(); return wac; } @@ -1279,6 +1288,16 @@ public class ServletAnnotationControllerTests { assertEquals("handle", response.getContentAsString()); } + + @Test + public void trailingSlash() throws Exception { + initServlet(TrailingSlashController.class); + + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo/"); + MockHttpServletResponse response = new MockHttpServletResponse(); + servlet.service(request, response); + assertEquals("templatePath", response.getContentAsString()); + } /* * Controllers @@ -2206,5 +2225,19 @@ public class ServletAnnotationControllerTests { } } + @Controller + public static class TrailingSlashController { + + @RequestMapping(value = "/", method = RequestMethod.GET) + public void root(Writer writer) throws IOException { + writer.write("root"); + } + + @RequestMapping(value = "/{templatePath}/", method = RequestMethod.GET) + public void templatePath(Writer writer) throws IOException { + writer.write("templatePath"); + } + } + }