Swagger ui를 붙여서 작성한 API를 시각화하려고 할 때 아래와 같은 에러가 계속 발생했다.
Failed to start bean 'documentationPluginsBootstrapper';
Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.toString()" because the return value of "springfox.documentation.spi.service.contexts.Orderings.patternsCondition(springfox.documentation.RequestHandler)" is null
(1) 우선 StackOverFlow에서 @EnableSwagger2 어노테이션을 제거하라는 글을 보고 그대로 진행했다: 그렇게 하면 swagger를 사용한다는 표시를 제거한 것이기 때문에 코드를 실행시키는데에는 문제가 뜨지만 url:port번호/swagger-ui.html으로 접속했을 때 아래와 가 같은 에러가 뜬다
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 // --> annotation을 제거했었음
public class SwaggerConfig {
@Bean
public Docket swagger() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.likelion.springjpaexcercise.controller"))
.paths(PathSelectors.any())
.build();
}
}
(2) application.yml에 matching-strategy를 설정해준다.
아래와 같은 코드를 넣어서 설정을 변경해주면 정상적으로 실행이 된다!
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
그 이유는 spring boot 2.6 버전부터 spring.mvc.pathmatch.matching-strategy의 기본값이 AntPathMatcher에서 PathPatternParser로 바뀌었기 때문에 발생한다고 한다. PathPatternParser에서는 spring.mvc.servlet.path가 지원되지 않기 때문이다.
대표적으로 Spring Security를 사용할 때 프로그램 시작 시 에러가 발생한다.
The default strategy for matching request paths against registered Spring MVC handler mappings has changed from AntPathMatcher to PathPatternParser.
A custom dispatcher servlet path (spring.mvc.servlet.path) is not supported when using PathPatternParser.
또한 Actuator나 Springfox를 이용하는 경우에도 작성한 프로그램이 시작되지 않다고 한다. annotation이나 web.xml을 이용해서 url을 입력했을 때 서블렛(servelet)이 그 url에 해당하는 자바파일을 실행되게 하는데(URL matching), 이를 위해서는 spring.mvc.servlet.path가 지원되어야 하기 때문이다.
cf. 이 프로젝트에서는 @PathVariable
을 통해 URL matching이 이루어졌다.
The actuator endpoints now also use PathPattern based URL matching. Note that the path matching strategy for actuator endpoints is not configurable via a configuration property. If you are using Actuator and Springfox, this may result in your application failing to start.
참고 자료