添加Actuator依赖后Spring Boot Rest API启动失败,触发Swagger空指针异常
这个问题的核心是旧版Springfox(2.9.2)与Spring Boot 2.6+版本不兼容,添加Actuator依赖后,Swagger在扫描并排序请求处理器时,遇到了Actuator端点的处理类,触发了空指针异常(NPE)。
从错误栈可以看到,NPE发生在springfox.documentation.spi.service.contexts.Orderings$8.compare方法中,说明Swagger在对请求处理器排序时,某个处理器的handlerMethod为null——而Actuator引入的端点处理器恰好符合这个情况,导致排序失败。
方案1:升级Springfox到兼容版本
Springfox 3.0.0及以上版本已经适配了Spring Boot 2.6+的特性,包括路径匹配规则和web组件的变化。修改pom.xml中的Swagger依赖:
<!-- 替换旧的swagger2和swagger-ui依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <!-- 移除单独的swagger2、swagger-ui依赖 -->
同时可以简化Swagger配置类,Springfox Boot Starter会自动配置大部分内容,若需自定义规则可保留原有配置逻辑。
方案2:排除Actuator端点被Swagger扫描
如果不想升级Springfox,可以在Swagger的Docket配置中排除Actuator的路径,避免Swagger扫描到Actuator的请求处理器:
在SwaggerConfig.java中修改Docket配置:
@Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.playground")) // 仅扫描业务代码包 .paths(PathSelectors.regex("/(?!actuator).*")) // 排除所有actuator路径 .build() .apiInfo(apiInfo()); }
这样Swagger只会扫描业务端点,不会处理Actuator的请求处理器,避免触发NPE。
方案3:调整请求处理器过滤逻辑
如果坚持使用旧版Springfox,还可以通过自定义Bean过滤掉不兼容的请求处理器:
@Bean public WebMvcRequestHandlerProvider webMvcRequestHandlerProvider(ApplicationContext applicationContext) { List<RequestMappingHandlerMapping> handlerMappings = applicationContext.getBeansOfType(RequestMappingHandlerMapping.class).values().stream() .filter(mapping -> mapping.getPatternParser() == null) .collect(Collectors.toList()); return new WebMvcRequestHandlerProvider(handlerMappings); }
这个Bean会过滤掉使用PatternParser的请求处理器(Actuator端点可能使用该规则),只保留使用AntPathMatcher的处理器,避免Swagger处理到不兼容的请求处理器。
选择任意一种方案后,重新添加Actuator依赖并启动应用,即可实现Swagger与Actuator的正常共存。
内容的提问来源于stack exchange,提问作者Syed Noman Ahmed

