🔥 문제 발생 상황
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