Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


Spring Boot Controller 路径匹配规则

Spring Boot 大约 2045 字

配置文件

path_pattern_parserSpring5中有引入的路径匹配规则,专用于SpringMVC

spring:
  mvc:
    pathmatch:
      matching-strategy: path_pattern_parser

2.6.0 之前

默认是ant_path_matcher解析方式。

// org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.Pathmatch
public static class Pathmatch {
    private MatchingStrategy matchingStrategy;
    private boolean useSuffixPattern;
    private boolean useRegisteredSuffixPattern;

    public Pathmatch() {
        this.matchingStrategy = WebMvcProperties.MatchingStrategy.ANT_PATH_MATCHER;
        this.useSuffixPattern = false;
        this.useRegisteredSuffixPattern = false;
    }
}

2.6.0 之后

默认是path_pattern_parser解析方式。

// org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.Pathmatch
public static class Pathmatch {
    private MatchingStrategy matchingStrategy;
    private boolean useSuffixPattern;
    private boolean useRegisteredSuffixPattern;

    public Pathmatch() {
        this.matchingStrategy = WebMvcProperties.MatchingStrategy.PATH_PATTERN_PARSER;
        this.useSuffixPattern = false;
        this.useRegisteredSuffixPattern = false;
    }
}

差别

ant_path_matcher

  • 通配符可以在中间,如:abc/**/xyz

path_pattern_parser

  • 通配符只能定义在尾部,如:abc/xyz/**
  • 可以使用{*path}接收多级路由。path可以随意取名,与@PathVariable名称对应即可。

{*path}

定义{*path},使用@PathVariable String path接收。

可以获取多级路径,没有{**path}这种写法。

// Spring Boot2.6.0前会抛出以下错误
// Capturing patterns (*path) are not supported by the AntPathMatcher. Use the PathPatternParser instead.
// Spring Boot2.6.0后支持
@RequestMapping("/pass/{*path}")
public String pass(@PathVariable String path) {
    System.out.println("pass#" + path);
    return "pass#" + path;
}

接收一级路径

/*可以接收一级路径。

@RequestMapping("/pass/*")
public String pass(HttpServletRequest request) {
    System.out.println("pass#" + request.getServletPath());
    return "pass#" + request.getServletPath();
}

接收多级路径

/**可以接收多级路径。

@RequestMapping("/pass/**")
public String pass(HttpServletRequest request) {
    System.out.println("pass#" + request.getServletPath());
    return "pass#" + request.getServletPath();
}
阅读 455 · 发布于 2022-09-27

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批