Skip to content

Commit

Permalink
fix(Fusion): Spring Boot 2.4 string pattern request mapping compatibi…
Browse files Browse the repository at this point in the history
…lity (#12642) (#12663)

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.

Co-authored-by: Anton Platonov <[email protected]>
  • Loading branch information
vaadin-bot and platosha authored Jan 3, 2022
1 parent ccfde5f commit 931dbea
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 Boot 2.6).
//
// 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 931dbea

Please sign in to comment.