There seems to be an asymmetry between MVC and Webflux with the AbstractUrlHandlerMapping. The MVC one parses out the URI variables and dumps them in a request attribute. The Webflux one does not. Here's what I did:
class MyHandlerMapping extends AbstractUrlHandlerMapping {
@Override
protected Object lookupHandler(PathContainer lookupPath, ServerWebExchange exchange) throws Exception {
Object result = super.lookupHandler(lookupPath, exchange);
if (result == null) {
return result;
}
PathPattern bestPattern = (PathPattern) exchange.getAttributes().get(BEST_MATCHING_PATTERN_ATTRIBUTE);
Map<String, String> uriVariables;
Map<String, MultiValueMap<String, String>> matrixVariables;
if (bestPattern == null) {
bestPattern = getPathPatternParser().parse(lookupPath.value());
uriVariables = Collections.emptyMap();
matrixVariables = Collections.emptyMap();
}
else {
PathPattern.PathMatchInfo match = bestPattern.matchAndExtract(lookupPath);
Assert.notNull(match, () ->
"Expected pattern to match lookupPath " + lookupPath);
uriVariables = match.getUriVariables();
matrixVariables = match.getMatrixVariables();
}
exchange.getAttributes().put(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriVariables);
exchange.getAttributes().put(MATRIX_VARIABLES_ATTRIBUTE, matrixVariables);
return result;
}
...
(Code copied from RequestMappingInfoHandlerMapping.handleMatch.)
Would it be reasonable for that to be the default?