升级Spring Boot2.7.0后documentationPluginsBootstrapper启动失败求助
问题根因
Spring Boot 2.7.0默认将Spring MVC路径匹配实现从AntPathMatcher替换为PathPatternParser,项目中引入的Springfox 2.9.2未适配该变更,初始化documentationPluginsBootstrapper Bean时无法正确获取路径匹配处理器,触发空指针异常。当前配置的Spring Cloud 2021.0.3、CXF 3.4.3与Spring Boot 2.7.0本身不存在兼容性冲突,无需调整这两个组件的版本。
解决步骤
- 调整路径匹配策略为Springfox兼容模式
在项目配置文件中添加对应配置,切回Springfox支持的路径匹配实现:application.yml格式配置:spring: mvc: pathmatch: matching-strategy: ant_path_matcherapplication.properties格式配置:spring.mvc.pathmatch.matching-strategy=ant_path_matcher - 添加兼容配置类,修复Springfox Handler映射扫描缺陷
仅修改路径匹配策略在Spring Cloud、CXF共存的场景下仍可能触发空指针,需要在项目中添加如下配置类,过滤掉Springfox无法识别的Handler映射实例:import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.ReflectionUtils; import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; import java.lang.reflect.Field; import java.util.List; import java.util.stream.Collectors; @Configuration public class SpringfoxCompatibleConfig { @Bean public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { return new BeanPostProcessor() { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof WebMvcRequestHandlerProvider) { List<RequestMappingInfoHandlerMapping> handlerMappings = getHandlerMappings(bean); List<RequestMappingInfoHandlerMapping> validMappings = handlerMappings.stream() .filter(mapping -> mapping.getPatternParser() == null) .collect(Collectors.toList()); handlerMappings.clear(); handlerMappings.addAll(validMappings); } return bean; } @SuppressWarnings("unchecked") private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { try { Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); field.setAccessible(true); return (List<RequestMappingInfoHandlerMapping>) field.get(bean); } catch (IllegalAccessException e) { throw new IllegalStateException(e); } } }; } } - 长期适配方案(可选)
Springfox 2.9.2已停止维护,无法适配Spring Boot 3.x及以上版本,如果后续有更高版本的Spring Boot升级计划,可以直接替换为持续维护的SpringDoc OpenAPI组件,无需额外编写兼容补丁。
验证方式
配置完成后重启应用,访问Swagger UI地址即可正常加载接口文档,documentationPluginsBootstrapper启动异常会完全消失。
内容的提问来源于stack exchange,提问作者Dibya
相关产品推荐
相关产品推荐

