报错原因:spring 2.6.x之后路径匹配策略改为:PathPatternMatcher了,但是springfox使用的是 AntPathMatcher。
首先想到就是回退spring的版本…..但是回退版本是不可能回退了,这一辈子都不可能回退了。
因此解决方案就是要么修改spring的路径匹配策略,要么修改springfox的路径匹配策略。
- 方案1
全网搜索最多的解决方案就是修改spring的匹配策略,如下:
在application.properties里配置:
spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER。
或yml配置:
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHE
- 方案2
修改springfox的匹配策略,这只是一种思路。
@Slf4j
@Configuration
public class BeanPostProcessorConfig {
@Bean
public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
}
return bean;
}
private void customizeSpringfoxHandlerMappings(List mappings) {
List copy = mappings.stream()
.filter(mapping -> mapping.getPatternParser() == null)
.collect(Collectors.toList());
mappings.clear();
mappings.addAll(copy);
}
@SuppressWarnings("unchecked")
private List getHandlerMappings(Object bean) {
try {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
field.setAccessible(true);
return (List) field.get(bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
};
}
}
- 方案3 (推荐)
springboot换不了,可以换掉springfox。查了一下,可以使用springdoc来生成spring的api文档,其实springdoc也是用了swagger的ui,对于使用者来说基本上没什么变化。
至于推荐原因,现在springfox基本上不再维护了,springdoc还在继续维护,而且更加符合openAPI3.0的规范。
参见:报错之Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.Nul问题及解决方案