freezner

[Kotlin] [SpringBoot 2.7.x] Swagger 3 documentationPluginsBootstrapper 에러 해결 방법

코틀린 + 스프링부트 환경에서 스웨거3를 세팅하던 중 오랫만에 나에게 삽질을 하도록 삽을 쥐어준 에러는 아래와 같다.
Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException

이 에러로 구글링과 ChatGPT 검색을 해보니 결과가 꽤나 나왔고 쉽게 해결될 줄 알았다..
대부분의 해결 방법은 이러했다.
application.properties 파일에 spring.mvc.pathmatch.matching-strategy=ant_path_matcher 설정을 추가해라. 스프링부트 2.6 이후 버전에서는 matching-strategy의 default 값이 ant_path_matcher에서 path-pattern-parser으로 변경되어 Swagger에서 충돌이 발생하는 것이 원인이다.

이 글을 쓰는 이유기도 하지만 역시나 위 조치로 해결되지 않았다. 다른 이유도 있을까하여 다른 검색 결과도 확인해보니 같은 내용으로 복붙들만 즐비했다..

삽질의 시작을 알리는 시그널이 본능적으로 느껴졌다. 해결을 못하면 잠이 오지 않을 것이기 때문에 하나하나 뜯어봤다.

결국 구글링이나 ChatGPT는 별 도움이 되지 않았고 찾아낸 원인은 spring-boot-starter-actuator 였다. Swagger와 Actuator가 서로 충돌했던 것이 원인..

Gradle에서 spring-boot-starter-actuator의 사용을 비활성했더니 잘 된다..

matching-strategy 설정도 문제의 원인이 아니었다. 그래서 지워버렸다.

그럼 아래는 Swagger 설정 코드 샘플이다..

# SwaggerConfig.kt

@Configuration
@EnableWebMvc
class SwaggerConfig {

    @Bean
    fun swaggerApi(): Docket {
        return Docket(DocumentationType.OAS_30)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.ant("/**"))
                .build()
                .useDefaultResponseMessages(false)
    }
}
# build.gradle.kts

plugins {
	id("org.springframework.boot") version "2.7.13"
	id("io.spring.dependency-management") version "1.0.15.RELEASE"
	kotlin("jvm") version "1.6.21"
	kotlin("plugin.spring") version "1.6.21"
}

dependencies {
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	implementation("org.springframework.boot:spring-boot-starter")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("org.springframework.boot:spring-boot-starter-validation")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
	implementation(mapOf("group" to "io.github.microutils", "name" to "kotlin-logging-jvm", "version" to "2.1.23"))
	implementation(mapOf("group" to "com.fasterxml.jackson.core", "name" to "jackson-databind", "version" to "2.14.1"))
	
	//  이놈이 원인..
	//	implementation("org.springframework.boot:spring-boot-starter-actuator")

	// Swagger 의존성 라이브러리
	implementation(mapOf("group" to "io.springfox", "name" to "springfox-swagger-ui", "version" to "3.0.0"))
	implementation(mapOf("group" to "io.springfox", "name" to "springfox-boot-starter", "version" to "3.0.0"))
}
Exit mobile version