DOIFOR技术问题:Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException
DOIFOR技术问题:Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException

问题:Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException

技术问题处理

报错原因: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的规范。

参见:springdoc-openapi 的基本使用

参见:报错之Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.Nul问题及解决方案

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注