diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java index 4709f9c368..a98b2db2b5 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java @@ -85,10 +85,11 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) { super.handleMatch(info, lookupPath, request); - String pattern = info.getPatternsCondition().getPatterns().iterator().next(); - request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, pattern); + Set patterns = info.getPatternsCondition().getPatterns(); + String bestPattern = patterns.isEmpty() ? lookupPath : patterns.iterator().next(); + request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern); - Map uriTemplateVariables = getPathMatcher().extractUriTemplateVariables(pattern, lookupPath); + Map uriTemplateVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVariables); if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) { diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java index 6fd4d5a984..e38c87ac46 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java @@ -204,12 +204,22 @@ public class RequestMappingInfoHandlerMappingTests { @Test public void bestMatchingPatternAttribute() { - PatternsRequestCondition patterns = new PatternsRequestCondition("/1/2", "/{path1}/2"); + PatternsRequestCondition patterns = new PatternsRequestCondition("/{path1}/2", "/**"); RequestMappingInfo key = new RequestMappingInfo(patterns, null, null, null, null, null, null); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/1/2"); - String lookupPath = new UrlPathHelper().getLookupPathForRequest(request); - this.mapping.handleMatch(key, lookupPath, request); + this.mapping.handleMatch(key, "/1/2", request); + + assertEquals("/{path1}/2", request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)); + } + + @Test + public void bestMatchingPatternAttributeNoPatternsDefined() { + PatternsRequestCondition patterns = new PatternsRequestCondition(); + RequestMappingInfo key = new RequestMappingInfo(patterns, null, null, null, null, null, null); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/1/2"); + + this.mapping.handleMatch(key, "/1/2", request); assertEquals("/1/2", request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)); }