StackTraces
Spring Boot已验证

Swagger 启动报 documentationPluginsBootstrapper NPE

@debug_master32 天前更新阅读 6 min00

这个 NPE 是 Spring Boot 2.6 改默认路径匹配策略引发的。springfox 3.0.0 只认 AntPathMatcher,撞上新默认的 PathPatternParser 就空指针。要么把匹配策略设回 ant_path_matcher,要么直接迁到还在维护的 springdoc-openapi。

Issue & Env(案发现场与环境)

  • 业务场景:项目从 Spring Boot 2.5 升到 2.6 及以上,Swagger 文档接口访问不了,应用启动即失败。
  • 环境:Spring Boot 2.6.x(含 2.7.x)+ springfox 3.0.0 + JDK 8/11/17 均可复现。springfox 官方 issue #3909 标注为 wontfix,即框架自身不会修。

StackTrace(堆栈日志)

启动阶段 documentationPluginsBootstrapper 这个 Bean 起不来,NPE 落在 springfox 读路径模式的地方:

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181)
	at org.springframework.context.support.DefaultLifecycleProcessor.lambda$startBeans$1(DefaultLifecycleProcessor.java:152)
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1767)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.NullPointerException: null
	at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56)
	at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113)
	at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89)
	at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
	at java.util.TimSort.sort(TimSort.java:220)
	at java.util.Arrays.sort(Arrays.java:1512)
	at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:349)
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:498)
	at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100)
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
	... 5 more

现在默认策略换成了 PathPatternParser,而 WebMvcPatternsRequestConditionWrapper.getPatterns() 里拿到的 PathPattern 与 springfox 预期的 AntPathMatcher 结构对不上,触发了空指针。

Reproduce(复现代码)

pom 引入 springfox 3.0.0(这是最后发布的版本,已停更):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.2</version>
</parent>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

写一个带 Swagger 注解的接口:

@RestController
public class DocController {
    @GetMapping("/hello")
    @ApiOperation("打招呼")
    public String hello() {
        return "hi";
    }
}

启动即抛上面的 NPE。注意:环境是 Spring Boot 2.6+(含 2.7.x)时才稳定复现,2.5.x 及更早不会。

Root Cause(根因分析)

Spring Boot 2.6.0 把 Spring MVC 的默认路径匹配策略,从 AntPathMatcher 换成了 PathPatternParser(PathMatchConfigurer 的默认值变化)。PathPatternParser 性能更好,也能显式扩展,但 API 和 AntPathMatcher 完全不同。

springfox 3.0.0 在扫描请求处理器时,直接假设 MVC 用的是 AntPathMatcher,代码路径走到了 WebMvcPatternsRequestConditionWrapper.getPatterns(),从 PathPatternParser 生成的对象里取自己预期的东西,结果拿到 null 或对不上,抛出 NullPointerException。

springfox 项目已经长期不活跃,3.0.0 是 2020 年的发布,此后没有再跟进 Spring Boot 2.6 的这次变更。所以这是环境升级和依赖过期的「双向奔赴」,不是应用代码写错。

The Fix(解决方案)

方案一:把匹配策略设回 ant_path_matcher(临时绕过)

在 application.yml 里:

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

application.properties 同理:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

效果是让 MVC 回到 springfox 适应的那套匹配策略,NPE 消失。代价是放弃了 PathPatternParser 的性能与扩展能力,而且这是给一个已停止维护的框架续命,属于过渡手段。有报 ANT_PATH_MATCHER 未生效的情况,多是同时用了 Actuator 的 WebMvcEndpointHandlerMapping,需要额外处理,见 issue #3462 的讨论。

方案二:迁移到 springdoc-openapi(推荐)

springfox 已停更,长线上应该换成还在活跃维护的 springdoc-openapi。Starter 名和注解对应关系:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.6.0</version>
</dependency>

它原生兼容 PathPatternParser,不需要改任何匹配策略。注解从 @Api/@ApiOperation 换成 OpenAPI 3 的 @Operation 等,文档地址从 /swagger-ui.html 变成 /swagger-ui/index.html。好处是不靠「绕行参数」支撑,能从根上摆脱这次版本兼容问题。

References(参考来源)

最后更新于 2026-09-09

这篇帮到你了吗?

刚解决了一个棘手的报错?花两分钟记录下来,帮助下一个遇到同样问题的开发者。

贡献一条解法