diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java index be143298c1a..9a93a65a4d2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java @@ -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; } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java index ad59c77fff4..ae4e4a0faa0 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMappingTests.java @@ -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 vars = exchange.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + assertThat(vars).isNotNull().containsEntry("bar", "123"); + } @Configuration static class WebConfig {