Spring Boot中 MVC匹配策略

问题

Spring Boot 2.7.7使用knife4j进行接口文档整合,发现报了个错误

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

排查了半天发现是这个问题

  • Spring Boot 2.6及以上默认路劲的匹配规则是 PATH_PATTERN_PARSER
  • Spring Fox使用的路径匹配是基于 ANT_PATH_MATCHER

Spring MVC 源码中两种匹配策略

 public static enum MatchingStrategy {
        ANT_PATH_MATCHER,
        PATH_PATTERN_PARSER;

        private MatchingStrategy() {
        }
    }

MatchingStrategy 枚举类型是在 Spring Boot 2.6.x 版本中引入的,用于 RequestMappingHandlerMapping 的构造函数参数中。这个枚举类型实际上是对 Spring MVC 中默认的两种匹配策略 AntPathMatcher RequestMappingInfoHandlerMapping 的一种封装。

其中,ANT_PATH_MATCHER 对应的是 AntPathMatcher 的匹配策略,而 PATH_PATTERN_PARSER 对应的是 RequestMappingInfoHandlerMapping 的匹配策略。

在 Spring Boot 2.6.x 及以后版本中,可以通过设置 spring.mvc.pathmatch.matching-strategy 属性来选择使用哪种匹配策略。如果不指定该属性,则默认使用 AntPathMatcher 的匹配策

ANT_PATH_MATCHER

ANT_PATH_MATCHER 是 Spring MVC 中常用的一种路径匹配器,它支持使用 Ant 风格的路径表达式来进行请求路径的匹配,例如:

  • ?:匹配任意单个字符。
  • *:匹配任意数量的字符,但不能匹配路径分隔符 /
  • **:匹配任意数量的字符,包括路径分隔符 /

除此之外,AntPathMatcher 还支持使用 {} 来定义路径变量,例如

@GetMapping("/users/{userId}")
public User getUser(@PathVariable("userId") Long userId) {
    // ...
}

通过 {} 定义的路径变量将被解析为方法参数,从而方便地获取 URL 中的参数值。

PATH_PATTERN_PARSER

PATH_PATTERN_PARSER是一种更复杂的匹配策略,它支持更多的条件匹配,例如:

  • 请求方法匹配(例如 GETPOST 等)。
  • 请求头匹配(例如 Content-TypeAccept 等)。
  • 请求参数匹配(例如 ?name=value)。

通过这些条件匹配,PATH_PATTERN_PARSER 可以更精确地匹配请求路径,从而更好地处理请求。
不过需要注意的是,由于 PATH_PATTERN_PARSER 的匹配策略更为复杂,所以在大量请求并发的情况下,可能会影响性能。
因此,在一般情况下,推荐使用默认的 AntPathMatcher 匹配策略。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值