You might encounter the “Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException” error while upgrading Spring Boot and Swagger API Documentation from 2.5.0 to 2.6.X and 2.X to 3.X respectively.

This issue is caused by the new path pattern-based path matching strategy for Spring MVC which is now the new default from Spring Boot 2.6.0 and is not supported by Spring Fox 3.0.0.

You can resolve this error by the below workaround:

  1. Set the below path matcher property in the application.properties file.

spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER
2. Add the following bean in the Spring Boot starter file.

点击查看代码
@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, Environment environment) {
    List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
    Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
    allEndpoints.addAll(webEndpoints);
    allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
    allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
    String basePath = webEndpointProperties.getBasePath();
    EndpointMapping endpointMapping = new EndpointMapping(basePath);
    boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
    return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
}

private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
    return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
}
  1. Restart the application.
posted on 2023-02-28 09:38  肖建锋  阅读(77)  评论(0编辑  收藏  举报