티스토리 뷰
springboot 2.6.7
springfox 2.9.2
버그 발생 상황
트래픽 모니터링을 위해 actuator와 prometheus 의존성 추가를 하려고 하니
정말 밑도 끝도 없이 caused by: java.lang.nullpointerexception: null이 발생하며 프로젝트가 실행되지 않았다.
stacktrace도 안 나오고 그냥 에러 메시지 하나만 딸랑 던지고 끝내버려서 매우 당황스러웠다.
아무리 찾아봐도 딱 핀포인트하게 해당 에러에 대해서 알려주는 내용이 없어 이런 저런 글을 읽다보니 계속해서 Swagger 얘기가 나온다.설마하고 해당 내용에 대해서 좀 자세히 찾아보니 다음과 같은 글을 찾았다.
Springfox broke my JPA tests, and the actuator for Prometheus. It took several attempts to fix and was very annoying.
Swagger는 모든 endpoint에 대해 documentation 해주는 역할이고
Actuator는 몇 몇 endpoint를 직접 생성해서 노출시켜주는 역할이니 이 두 의존성이 충돌되는 것으로 판단했다.
아래 의존성을 제거하고 나니 NPE도 발생하지 않고 프로젝트도 run이 된다!
//implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
//implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
해결 방법
두 의존성이 충돌하여 발생하는 문제임은 확인하였으나 두 의존성을 사용해야 했으므로 한 쪽 의존성을 제거하지 않고 사용하는 방법을 찾아보고자 하였다.어떤 의존성이 충돌나는지 확인이 되고나서 해당 키워드로 검색을 하니 정말 수십 수백개가 넘는 결과가 나왔다.검색 키워드를 어떻게 넣는지가 이렇게 중요하다..!
간단한 해결 방법
아무튼 검색에 의해 스프링부트 2.6.X에서 springfox에 의해 발생하는 버그임을 알게 되었다.
그러므로 가장 간단한 해결 방법은 2.6.X을 2.5.X로 내리면 된다!2.5.8이나 2.5.6으로 내리면 문제없이 동작한다고 한다.
//기존
plugins {
id 'org.springframework.boot' version '2.6.7'
}
//다운그레이드
plugins {
id 'org.springframework.boot' version '2.5.8'
}
//혹은
plugins {
id 'org.springframework.boot' version '2.5.6'
}
확실한 해결 방법
좀 더 복잡하지만 버전 변경없이 확실한 해결 방법은 다음과 같다.
application.properties에 다음 코드를 추가.
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
그리고 아래의 코드를 추가. Bean이므로 어디에 추가해도 상관없을 것으로 생각하나 본인은 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));
}
발생 원인
Springfox는 Spring MVC가 Ant-based path matcher를 기본값으로 하여 경로를 찾는 것으로 가정하는데
Spring MVC가 2.6.X부터 기본값을 Ant-based path matcher에서 PathPattern-based matcher로 변경하여서 발생하는 버그이다.
Note: In contrast to AntPathMatcher, ** is supported only at the end of a pattern. For example
/pages/{**} is valid but /pages/{**}/details is not. The same applies also to the capturing variant {*spring}. The aim is to eliminate ambiguity when comparing patterns for specificity.
레퍼런스
'트러블슈팅' 카테고리의 다른 글
Swagger2 문서화시 tags의 description deprecated 대체재 (3) | 2022.07.28 |
---|---|
스프링부트와 프로메테우스 연동시 "INVALID" is not a valid start token가 발생할 경우 해결 방법 (0) | 2022.07.25 |
@AllArgsConstructor는 @Value와 같이 동작하지 않는다. (0) | 2022.07.04 |
젠킨스 SSH로 sh를 실행할때 경로에 주의하자 (0) | 2022.07.04 |
@Embeddable을 사용할때 NullPointerException을 방지하는 방법 (0) | 2022.06.04 |
- Total
- Today
- Yesterday
- 도커
- 루나빔
- 아키텍처
- JavaScript
- Dap
- RequestBody
- lunarvim
- RequestParam
- 레디스
- IDE
- ModelAttribute
- 배포
- vim
- RequestPart
- neovim
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |