From a0c41a0e038b020e1d16aee0ca90cc5aeb2bfb1a Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 4 Mar 2010 15:17:09 +0000 Subject: [PATCH] SPR-6906 - Combination of ControllerClassNameHandlerMapping and @RequestMappings with file extensions results in exception --- .../AnnotationMethodHandlerAdapter.java | 34 ++++------------ .../servlet/mvc/annotation/FooController.java | 40 +++++++++++++++++++ ...plateServletAnnotationControllerTests.java | 34 +++++++++++++++- 3 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/FooController.java 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 9619ee1e6c..a6afb1669a 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 @@ -629,35 +629,15 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator } @SuppressWarnings("unchecked") - private void extractHandlerMethodUriTemplates(String mappedPath, + private void extractHandlerMethodUriTemplates(String mappedPattern, String lookupPath, HttpServletRequest request) { - Map variables = null; - boolean hasSuffix = (mappedPath.indexOf('.') != -1); - if (!hasSuffix && pathMatcher.match(mappedPath + ".*", lookupPath)) { - String realPath = mappedPath + ".*"; - if (pathMatcher.match(realPath, lookupPath)) { - variables = pathMatcher.extractUriTemplateVariables(realPath, lookupPath); - } - } - if (variables == null && !mappedPath.startsWith("/")) { - String realPath = "/**/" + mappedPath; - if (pathMatcher.match(realPath, lookupPath)) { - variables = pathMatcher.extractUriTemplateVariables(realPath, lookupPath); - } - else { - realPath = realPath + ".*"; - if (pathMatcher.match(realPath, lookupPath)) { - variables = pathMatcher.extractUriTemplateVariables(realPath, lookupPath); - } - } - } - if (!CollectionUtils.isEmpty(variables)) { - Map typeVariables = - (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); - if (typeVariables != null) { - variables.putAll(typeVariables); - } + + Map variables = + (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + + if (CollectionUtils.isEmpty(variables) && pathMatcher.match(mappedPattern, lookupPath)) { + variables = pathMatcher.extractUriTemplateVariables(mappedPattern, lookupPath); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, variables); } } diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/FooController.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/FooController.java new file mode 100644 index 0000000000..b1046bbb1c --- /dev/null +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/FooController.java @@ -0,0 +1,40 @@ +/* + * Copyright 2002-2010 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.web.servlet.mvc.annotation; + +import java.io.IOException; +import java.io.Writer; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** @author Arjen Poutsma */ +@Controller +public class FooController { + + @RequestMapping(value = "{id}", method = RequestMethod.GET) + public void plain(Writer writer, @PathVariable("id") String id) throws IOException { + writer.write("plain-" + id); + } + + @RequestMapping(value = "{id}.pdf", method = RequestMethod.GET) + public void pdf(Writer writer, @PathVariable("id") String id) throws IOException { + writer.write("pdf-" + id); + } +} 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 fcede5bb96..f14221b611 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -41,6 +41,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; +import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; /** @author Arjen Poutsma */ public class UriTemplateServletAnnotationControllerTests { @@ -337,7 +338,37 @@ public class UriTemplateServletAnnotationControllerTests { response = new MockHttpServletResponse(); servlet.service(request, response); assertEquals("bar-bar", response.getContentAsString()); + } + /* + * See SPR-6906 + */ + @Test + public void controllerClassName() throws Exception { + servlet = new DispatcherServlet() { + @Override + protected WebApplicationContext createWebApplicationContext(WebApplicationContext parent) + throws BeansException { + GenericWebApplicationContext wac = new GenericWebApplicationContext(); + wac.registerBeanDefinition("controller", new RootBeanDefinition(FooController.class)); + RootBeanDefinition mapping = new RootBeanDefinition(ControllerClassNameHandlerMapping.class); + mapping.getPropertyValues().add("excludedPackages", null); + wac.registerBeanDefinition("handlerMapping", mapping); + wac.refresh(); + return wac; + } + }; + servlet.init(new MockServletConfig()); + + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo/bar"); + MockHttpServletResponse response = new MockHttpServletResponse(); + servlet.service(request, response); + assertEquals("plain-bar", response.getContentAsString()); + + request = new MockHttpServletRequest("GET", "/foo/bar.pdf"); + response = new MockHttpServletResponse(); + servlet.service(request, response); + assertEquals("pdf-bar", response.getContentAsString()); } @@ -590,5 +621,4 @@ public class UriTemplateServletAnnotationControllerTests { } - }