Skip to content

Commit

Permalink
fix(Fusion): Spring MVC string patterns request mapping compatibility
Browse files Browse the repository at this point in the history
Fixes #12623

With Spring Boot 2.6, PathPattern matching is a default, however with
2.4 / 2.5 Spring MVC still uses string-based pattern matching for paths.

This fixes compatibility with string-based pattern mapping mode when
prepending the endpoint path prefix.
  • Loading branch information
platosha committed Dec 27, 2021
1 parent 61456fd commit 8760006
Showing 1 changed file with 22 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.pattern.PathPatternParser;

import com.vaadin.flow.server.auth.AccessAnnotationChecker;
import com.vaadin.fusion.auth.CsrfChecker;
Expand Down Expand Up @@ -95,9 +96,27 @@ protected void registerHandlerMethod(Object handler,
*/
private RequestMappingInfo prependEndpointPrefixUrl(
RequestMappingInfo mapping) {
return mapping.mutate()
.paths(fusionEndpointProperties.getVaadinEndpointPrefix())
.build().combine(mapping);
RequestMappingInfo.Builder prefixMappingBuilder = RequestMappingInfo.paths(
fusionEndpointProperties.getVaadinEndpointPrefix());
if (mapping.getPatternsCondition() == null) {
// `getPatternsCondition()` and `getPathPatternsCondition()` are
// mutually exclusive: only one of them is active, the other
// returns null. Since patterns condition is null here, let us
// assume `mapping` uses parsed PathPatterns condition (default
// since Spring MVC 5.3).
//
// However, `prefixMappingBuilder` uses non-parsed patterns
// condition by default, which does not combine with parsed
// PathPatterns condition in `RequestMappingInfo.combine()`.
//
// Set the pattern parser option for `prefixMappingBuilder`
// to make it use parsed PathPatterns condition, so that
// `.combine(mapping)` below works.
RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration();
options.setPatternParser(PathPatternParser.defaultInstance);
prefixMappingBuilder.options(options);
}
return prefixMappingBuilder.build().combine(mapping);
}

/**
Expand Down

0 comments on commit 8760006

Please sign in to comment.