WebFlux AbstractUrlHandlerMapping support URI vars
Closes gh-25648
This commit is contained in:
@@ -126,11 +126,14 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
|
||||
|
||||
PathPattern pattern = matches.get(0);
|
||||
PathContainer pathWithinMapping = pattern.extractPathWithinPattern(lookupPath);
|
||||
return handleMatch(this.handlerMap.get(pattern), pattern, pathWithinMapping, exchange);
|
||||
PathPattern.PathMatchInfo matchInfo = pattern.matchAndExtract(lookupPath);
|
||||
Assert.notNull(matchInfo, "Expected a match");
|
||||
|
||||
return handleMatch(this.handlerMap.get(pattern), pattern, pathWithinMapping, matchInfo, exchange);
|
||||
}
|
||||
|
||||
private Object handleMatch(Object handler, PathPattern bestMatch, PathContainer pathWithinMapping,
|
||||
ServerWebExchange exchange) {
|
||||
PathPattern.PathMatchInfo matchInfo, ServerWebExchange exchange) {
|
||||
|
||||
// Bean name or resolved handler?
|
||||
if (handler instanceof String) {
|
||||
@@ -143,6 +146,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
|
||||
exchange.getAttributes().put(BEST_MATCHING_HANDLER_ATTRIBUTE, handler);
|
||||
exchange.getAttributes().put(BEST_MATCHING_PATTERN_ATTRIBUTE, bestMatch);
|
||||
exchange.getAttributes().put(PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
|
||||
exchange.getAttributes().put(URI_TEMPLATE_VARIABLES_ATTRIBUTE, matchInfo.getUriVariables());
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package org.springframework.web.reactive.handler;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -115,6 +117,19 @@ public class SimpleUrlHandlerMappingTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void uriTemplateVariables() {
|
||||
Object handler = new Object();
|
||||
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
|
||||
mapping.registerHandlers(Collections.singletonMap("/foo/{bar}/baz", handler));
|
||||
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/foo/123/baz").build());
|
||||
Object expected = mapping.getHandler(exchange).block();
|
||||
assertThat(expected).isSameAs(handler);
|
||||
|
||||
Map<String, String> vars = exchange.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
|
||||
assertThat(vars).isNotNull().containsEntry("bar", "123");
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class WebConfig {
|
||||
|
||||
Reference in New Issue
Block a user