Spring Swagger가 적용되어 있는 환경 속에 모니터링 시스템을 위해 Actuator를 추가하였더니
아래와 같은 오류가 발생했다.
Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException:
기본적으로 해당 오류는 Swagger에서 발생하는 오류로 spring fox에서 업데이트를 진행하지 않아 생긴 버전 이슈이다.
application.yml
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
Actuator를 사용하지 않는다면 해당 설정으로 오류를 해결할 수 있다.
하지만 Swagger와 Actuator를 동시에 사용한다면 해당 설정으로 해결되지 않는다.
문제 원인
- Swagger는 모든 endpoint에 대해 문서화를 해주는 기능이다.
- Actuator 또한 endpoint 등을 직접 생성하는 역할 → Swagger와 의존성이 충돌한다.
@Configuration
public class ServerConfig {
@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));
}
}
- 해당 코드는 Spring 웹 애플리케이션에서 엔드포인트를 설정하는 것입니다.
- webEndpointsSupplier, servletEndpointsSupplier, controllerEndpointsSupplier 해당 endpoint 정보를 가져옵니다.
- basePath를 기반으로 하여 EndpointMapping 객체를 생성하여 경로를 설정합니다.
- shouldRegisterLinksMapping : endpoint의 디스커버리와 포트를 링크 매핑에 등록할지 여부를 결정합니다.
- **디스커버리 엔드포인트(Discovery Endpoint)**는 Spring Boot 애플리케이션에서 사용 가능한 다양한 서비스 및 엔드포인트를 찾고 검색하기 위한 엔드포인트 중 하나입니다.
'Spring' 카테고리의 다른 글
| SpringBoot, Prometheus, Grafana를 사용하여 Monitoring 구축하기 (2) (0) | 2023.10.30 |
|---|---|
| [Spring] log 파일 생성 시 LOG_PATH_IS_UNDEFINED 생성 문제 (0) | 2023.10.27 |
| SpringBoot, Prometheus, Grafana를 사용하여 Monitoring 구축하기 (1) (1) | 2023.10.24 |
| [Spring] JPA N+1 발생 상황과 해결방법 (1) | 2023.10.11 |
| QueryDsl를 활용하여 DTO로 바로 만들기 (0) | 2023.08.02 |