티스토리 뷰

728x90

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.

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

 

AntPathMatcher (Spring Framework 5.3.22 API)

Combine two patterns into a new pattern. This implementation simply concatenates the two patterns, unless the first pattern contains a file extension match (e.g., *.html). In that case, the second pattern will be merged into the first. Otherwise, an Illega

docs.spring.io

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/pattern/PathPattern.html

 

PathPattern (Spring Framework 5.3.22 API)

Representation of a parsed path pattern. Includes a chain of path elements for fast matching and accumulates computed state for quick comparison of patterns. PathPattern matches URL paths using the following rules: ? matches one character * matches zero or

docs.spring.io

 

레퍼런스

https://stackoverflow.com/questions/70589430/nullpointerexception-when-upgrading-spring-boot-to-version-2-6-2

 

NullPointerException when upgrading Spring Boot to version 2.6.2

I upgraded by Spring Boot version from 2.5.4 to 2.6.2. Now my app fails at startup because of this error - see below. Any ideas how to fix it? Error starting ApplicationContext. To display the cond...

stackoverflow.com

 

https://stackoverflow.com/questions/70036953/springboot-2-6-0-spring-fox-3-failed-to-start-bean-documentationpluginsboot

 

Springboot 2.6.0 / Spring fox 3 - Failed to start bean 'documentationPluginsBootstrapper'

I'm trying to initiate a Springboot project using Open Jdk 15, Springboot 2.6.0, Springfox 3. We are working on a project that replaced Netty as the webserver and used Jetty instead because we do not

stackoverflow.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함