Swagger не работает, когда файл запуска приложения находится внутри пакета. Kotlin Springboot - PullRequest
0 голосов
/ 11 января 2020

Структура моего каталога проекта выглядит следующим образом:

└── activity
    ├── app
    │   └── ActivityApplication.kt
    ├── controller
    │   └── WelcomeMessageController.kt
    ├── exception
    │   ├── ActivityErrorResponse.kt
    │   ├── handler
    │   │   └── ActivityServiceExceptionHandler.kt
    │   └── response
    │       └── ResponseCode.kt
    ├── model
    │   └── WelcomeMessage.kt
    ├── repository
    │   └── WelcomeMessageRepository.kt
    ├── service
    │   └── WelcomeService.kt
    └── swagger
        └── SwaggerConfig.kt

Когда я перемещаю файл ActivityApplication.kt в пакет root, то есть прямо под activity страница сваггера начинает работать нормально. Однако, когда я перемещаю его в пакет (в данном случае app), на странице сваггера ничего не отображается, кроме следующей ошибки

Ошибка: Невозможно определить базовый URL. Это часто происходит при использовании регистрации сервлета Dynami c или когда API находится за шлюзом API. Базовый URL-адрес - это root, в котором хранятся все ресурсы чванства. Например, если API доступен в http://example.org/api/v2/api-docs, тогда базовый URL будет http://example.org/api/. Пожалуйста, введите местоположение вручную:

моя конфигурация сваггера выглядит следующим образом

@Configuration
@EnableSwagger2
class SwaggerConfig {
    @Bean
    fun api(): Docket {
        return Docket(DocumentationType.SWAGGER_2)
                .pathProvider(object: RelativePathProvider(null) {
                    override fun getApplicationBasePath(): String {
                        return "/activity"
                    }
                })
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.activity.controller"))
                .build()
                .apiInfo(buildApiInfo())
    }

    private fun buildApiInfo(): ApiInfo? {
        return ApiInfo(
                ...)
    }
}

ActivityApplication.kt имеет только следующий код

@SpringBootApplication
class ActivityApplication

fun main(args: Array<String>) {
    runApplication<ActivityApplication>(*args)
}
  • Java Версия : OpenJDK 11
  • Версия Springfox-swagger2 : 2.9.2

1 Ответ

1 голос
/ 12 января 2020

Spring Boot пытается найти свои компоненты в более глубоких пакетах. Т.е. если вы поместите @SpringBootApplication на activity.app.ActivityApplication, Spring Boot будет искать только под activity.app и не будет go до activity.swagger, на любых других пакетах.

Если вы не хотите чтобы переместить ваш ActivityApplication в activity пакет, вам нужно вручную указать базовые пакеты в параметре @SpringBootApplication аннотации scanBasePackages: @SpringBootApplication(scanBasePackages = "activity").

Примечание: следует быть полным пакетом, например mycompany.myproject.activity).

...