Browse Source

WebFlux AbstractUrlHandlerMapping support URI vars

Closes gh-25648
pull/25616/head
Rossen Stoyanchev 6 years ago
parent
commit
c4e1e4ee1e
  1. 8
      spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java
  2. 15
      spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java

8
spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java

@ -126,11 +126,14 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { @@ -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 { @@ -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;
}

15
spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java

@ -17,6 +17,8 @@ @@ -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 { @@ -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 {

Loading…
Cancel
Save