问题
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是一种更复杂的匹配策略,它支持更多的条件匹配,例如:
请求方法匹配(例如 GET、POST 等)。请求头匹配(例如 Content-Type、Accept 等)。请求参数匹配(例如 ?name=value)。
通过这些条件匹配,PATH_PATTERN_PARSER 可以更精确地匹配请求路径,从而更好地处理请求。 不过需要注意的是,由于 PATH_PATTERN_PARSER 的匹配策略更为复杂,所以在大量请求并发的情况下,可能会影响性能。 因此,在一般情况下,推荐使用默认的 AntPathMatcher 匹配策略。
参考链接
发表评论