🕹️ Programming/삽질기록

[SpringBoot] ApplicationContextException : Failed to start bean 'documentationPluginsBootstrapper'

an2z 2022. 9. 19. 22:06

🔥 문제 발생 상황

SpringBoot에 Actuator를 연동하여 실행했더니 아래와 같은 에러 메세지가 발생하였다.

org.springframework.context.ApplicationContextException: 
Failed to start bean 'documentationPluginsBootstrapper'; 
nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException: null
at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]

 

🦠 문제 원인 파악

SpringFox 측에서 업데이트를 진행하지 않아 SpringBoot 2.6.0 이상 버전에 대해서 에러가 발생하는 것이다.

 

🔑 문제 해결

해결방법은 2가지가 있다.

 

이때 2가지 방법 모두 아래의 설정이 적용되어 있어야 한다.

📁 application.yml
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
📁 application.properties
spring.mvc.pathmatch.matching-strategy = ant_path_matcher

 

방법1) SpringBoot 버전 다운 그레이드 하기

SpringBoot 2.6.0 버전 이상에서만 발생하는 문제이기 때문에 SpringBoot 버전을 2.5.X 이하로 다운 그레이드 할 경우 해결된다.

 

방법2) 버전 변경 없이 Config 추가하기

버전을 변경할 수 없는 경우 아래의 코드를 Config에 추가해주면 정상적으로 실행되는 것을 확인할 수 있다.

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    // 중략

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

 


Reference

https://www.inflearn.com/questions/439959