SPR-6876 - RequestMethod does not appear to factor into @RequestMapping uniqueness in some cases
This commit is contained in:
parent
20a8039642
commit
5675046cb7
|
|
@ -22,6 +22,7 @@ import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.Comparator;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
|
@ -257,8 +258,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String bestPatternMatch = null;
|
String bestPatternMatch = null;
|
||||||
|
Comparator<String> patternComparator = getPathMatcher().getPatternComparator(urlPath);
|
||||||
if (!matchingPatterns.isEmpty()) {
|
if (!matchingPatterns.isEmpty()) {
|
||||||
Collections.sort(matchingPatterns, getPathMatcher().getPatternComparator(urlPath));
|
Collections.sort(matchingPatterns, patternComparator);
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns);
|
logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns);
|
||||||
}
|
}
|
||||||
|
|
@ -273,8 +275,19 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
|
||||||
}
|
}
|
||||||
validateHandler(handler, request);
|
validateHandler(handler, request);
|
||||||
String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPatternMatch, urlPath);
|
String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPatternMatch, urlPath);
|
||||||
Map<String, String> 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<String, String> uriTemplateVariables = new LinkedHashMap<String, String>();
|
||||||
|
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);
|
return buildPathExposingHandler(handler, bestPatternMatch, pathWithinMapping, uriTemplateVariables);
|
||||||
}
|
}
|
||||||
// No handler found...
|
// No handler found...
|
||||||
|
|
|
||||||
|
|
@ -321,6 +321,25 @@ public class UriTemplateServletAnnotationControllerTests {
|
||||||
assertEquals("M5", response.getContentAsString());
|
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
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue