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


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));
}

3. Restart the application.

References

  1. PathPattern Based Path Matching Strategy for Spring MVC
  2. Customizing Swagger 2 RESTful API Documentation

Similar Posts

About the Author

Atul Rai
I love sharing my experiments and ideas with everyone by writing articles on the latest technological trends. Read all published posts by Atul Rai.