Skip to content

Add URI variables to request context in AbstractUrlHandlerMapping (reactive) #25648

@dsyer

Description

@dsyer

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?

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions