SPR-8255
This commit is contained in:
@@ -26,6 +26,7 @@ import java.util.Set;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.springframework.util.PathMatcher;
|
import org.springframework.util.PathMatcher;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.servlet.mvc.method.condition.RequestCondition;
|
import org.springframework.web.servlet.mvc.method.condition.RequestCondition;
|
||||||
@@ -92,7 +93,7 @@ public final class RequestKey {
|
|||||||
}
|
}
|
||||||
Set<String> result = new LinkedHashSet<String>(patterns.size());
|
Set<String> result = new LinkedHashSet<String>(patterns.size());
|
||||||
for (String pattern : patterns) {
|
for (String pattern : patterns) {
|
||||||
if (!pattern.startsWith("/")) {
|
if (StringUtils.hasLength(pattern) && !pattern.startsWith("/")) {
|
||||||
pattern = "/" + pattern;
|
pattern = "/" + pattern;
|
||||||
}
|
}
|
||||||
result.add(pattern);
|
result.add(pattern);
|
||||||
@@ -169,9 +170,9 @@ public final class RequestKey {
|
|||||||
* <ul>
|
* <ul>
|
||||||
* <li>URL patterns:
|
* <li>URL patterns:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>If both keys have path patterns combine them according to the rules of the given {@link PathMatcher}.
|
* <li>If both have patterns combine them according to the rules of the given {@link PathMatcher}
|
||||||
* <li>If either key contains path patterns but not both use only what is available.
|
* <li>If either contains patterns, but not both, use the available pattern
|
||||||
* <li>If neither key contains path patterns use "/".
|
* <li>If neither contains patterns use ""
|
||||||
* </ul>
|
* </ul>
|
||||||
* <li>HTTP methods are combined as union of all HTTP methods listed in both keys.
|
* <li>HTTP methods are combined as union of all HTTP methods listed in both keys.
|
||||||
* <li>Request parameter are combined into a logical AND.
|
* <li>Request parameter are combined into a logical AND.
|
||||||
@@ -198,8 +199,8 @@ public final class RequestKey {
|
|||||||
Set<String> result = new LinkedHashSet<String>();
|
Set<String> result = new LinkedHashSet<String>();
|
||||||
if (!typePatterns.isEmpty() && !methodPatterns.isEmpty()) {
|
if (!typePatterns.isEmpty() && !methodPatterns.isEmpty()) {
|
||||||
for (String pattern1 : typePatterns) {
|
for (String pattern1 : typePatterns) {
|
||||||
for (String p2 : methodPatterns) {
|
for (String pattern2 : methodPatterns) {
|
||||||
result.add(pathMatcher.combine(pattern1, p2));
|
result.add(pathMatcher.combine(pattern1, pattern2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
|
|||||||
webRequest.getResponse().sendError(this.responseStatus.value(), this.responseReason);
|
webRequest.getResponse().sendError(this.responseStatus.value(), this.responseReason);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
webRequest.getResponse().sendError(this.responseStatus.value());
|
webRequest.getResponse().setStatus(this.responseStatus.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
// to be picked up by the RedirectView
|
// to be picked up by the RedirectView
|
||||||
|
|||||||
@@ -77,9 +77,13 @@ public class RequestKeyTests {
|
|||||||
|
|
||||||
key1 = createKeyFromPatterns();
|
key1 = createKeyFromPatterns();
|
||||||
key2 = createKeyFromPatterns();
|
key2 = createKeyFromPatterns();
|
||||||
key3 = createKeyFromPatterns("/");
|
key3 = createKeyFromPatterns("");
|
||||||
|
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
|
||||||
|
|
||||||
|
key1 = createKeyFromPatterns("/t1");
|
||||||
|
key2 = createKeyFromPatterns("");
|
||||||
|
key3 = createKeyFromPatterns("/t1");
|
||||||
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
|
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -60,12 +60,15 @@ public class RequestMappingHandlerMethodMappingTests {
|
|||||||
|
|
||||||
private HandlerMethod barMethod;
|
private HandlerMethod barMethod;
|
||||||
|
|
||||||
|
private HandlerMethod emptyMethod;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
handler = new Handler();
|
handler = new Handler();
|
||||||
fooMethod = new HandlerMethod(handler, "foo");
|
fooMethod = new HandlerMethod(handler, "foo");
|
||||||
fooParamMethod = new HandlerMethod(handler, "fooParam");
|
fooParamMethod = new HandlerMethod(handler, "fooParam");
|
||||||
barMethod = new HandlerMethod(handler, "bar");
|
barMethod = new HandlerMethod(handler, "bar");
|
||||||
|
emptyMethod = new HandlerMethod(handler, "empty");
|
||||||
|
|
||||||
StaticApplicationContext context = new StaticApplicationContext();
|
StaticApplicationContext context = new StaticApplicationContext();
|
||||||
context.registerSingleton("handler", handler.getClass());
|
context.registerSingleton("handler", handler.getClass());
|
||||||
@@ -88,6 +91,17 @@ public class RequestMappingHandlerMethodMappingTests {
|
|||||||
assertEquals(barMethod.getMethod(), hm.getMethod());
|
assertEquals(barMethod.getMethod(), hm.getMethod());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void emptyPathMatch() throws Exception {
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", "");
|
||||||
|
HandlerMethod hm = (HandlerMethod) mapping.getHandler(request).getHandler();
|
||||||
|
assertEquals(emptyMethod.getMethod(), hm.getMethod());
|
||||||
|
|
||||||
|
request = new MockHttpServletRequest("GET", "/");
|
||||||
|
hm = (HandlerMethod) mapping.getHandler(request).getHandler();
|
||||||
|
assertEquals(emptyMethod.getMethod(), hm.getMethod());
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: SPR-8247
|
// TODO: SPR-8247
|
||||||
@Ignore
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
@@ -144,6 +158,7 @@ public class RequestMappingHandlerMethodMappingTests {
|
|||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Controller
|
@Controller
|
||||||
|
@RequestMapping
|
||||||
private static class Handler {
|
private static class Handler {
|
||||||
|
|
||||||
@RequestMapping(value = "/foo", method = RequestMethod.GET)
|
@RequestMapping(value = "/foo", method = RequestMethod.GET)
|
||||||
@@ -157,6 +172,10 @@ public class RequestMappingHandlerMethodMappingTests {
|
|||||||
@RequestMapping(value = "/ba*", method = { RequestMethod.GET, RequestMethod.HEAD })
|
@RequestMapping(value = "/ba*", method = { RequestMethod.GET, RequestMethod.HEAD })
|
||||||
public void bar() {
|
public void bar() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "")
|
||||||
|
public void empty() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user