Spring boot Swagger UI 启动时出现异常

Kit*_*Cat 5 spring kotlin swagger-ui spring-boot springdoc-openapi-ui

我正在尝试让 Swagger UI 在我的项目中工作,并且正在遵循这些文档,但是无论我尝试什么,我的应用程序都会立即崩溃,并出现以下异常:

上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“securityConfig”的 bean 时出错:通过方法“setContentNegotationStrategy”参数 0 表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration”的 bean 时出错:通过方法“setConfigurers”参数 0 表示不满足的依赖关系;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:创建类路径资源[org/springdoc/webmvc/ui/SwaggerConfig.class]中定义的名称为“swaggerWebMvcConfigurer”的bean时出错:通过方法“swaggerWebMvcConfigurer”参数1表达的依赖关系不满足; 嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建类路径资源 [org/springdoc/webmvc/ui/SwaggerConfig.class] 中定义的名称为“indexPageTransformer”的 bean 时出错:通过方法“indexPageTransformer”参数 3 表达的依赖关系不满足; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建在类路径资源 [org/springdoc/webmvc/ui/SwaggerConfig.class] 中定义的名为“swaggerWelcome”的 bean 时出错:合并 bean 定义的后处理失败;嵌套异常是 java.lang.IllegalStateException:无法从 ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7] 内省类 [org.springdoc.webmvc.ui.SwaggerWelcomeWebMvc]

我将 Kotlin 与 Spring Boot 结合使用,这些是我的 Gradle 依赖项:

implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-jooq")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-log4j2")
implementation("com.braintreepayments.gateway:braintree-java:3.14.0")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
implementation("com.fasterxml.jackson.core:jackson-databind:2.13.2")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2")
implementation("org.apache.logging.log4j:log4j-layout-template-json")
implementation("org.springdoc:springdoc-openapi-kotlin:1.6.6")
implementation("org.springdoc:springdoc-openapi-ui:1.6.6")
implementation("org.jooq:jooq-meta")
implementation("org.jooq:jooq-kotlin")
implementation("org.jooq:jooq-codegen")
implementation("org.jooq:jooq-codegen-maven")
implementation("org.jooq:jooq-meta-extensions")
implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.10")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10")
implementation("com.zaxxer:HikariCP:5.0.1")
implementation("com.github.ben-manes.caffeine:caffeine:3.0.5")
implementation("org.flywaydb:flyway-core:8.5.4")
implementation("org.postgresql:postgresql:42.3.3")
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多不同的包的很多不同的组合,但它总是会在启动时抛出异常。

Gradle 文件的插件部分:

plugins {
    id("org.springframework.boot") version "3.0.0-SNAPSHOT"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    id("org.flywaydb.flyway") version "8.5.4"
    id("nu.studer.jooq") version "7.1.1"
    kotlin("jvm") version "1.6.20-RC"
    kotlin("plugin.spring") version "1.6.20-RC"
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*ing 17

Spring Boot 3 将使用 Jakarta EE,而 Spring Boot 2 仍使用 Java EE。这一举措包括将 Servlet API 的命名空间从 更改javax.servletjakarta.servlet。您的应用程序失败,因为 Springdoc 1.x 尝试从旧名称空间加载类,但 Spring Boot 3 仅提取新名称空间。

Springdoc 发布了与 Jakarta EE 配合使用的里程碑版本以及 Spring Boot 3 的里程碑版本:https://github.com/springdoc/springdoc-openapi/issues/1284

在 Java 应用程序中,您可以替换

implementation 'org.springdoc:springdoc-openapi-ui:1.6.6'
Run Code Online (Sandbox Code Playgroud)

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0-M1'
Run Code Online (Sandbox Code Playgroud)

这里还有一个官方的 Maven 示例:https://github.com/springdoc/springdoc-openapi-demos/tree/2.x/demo-spring-boot-3-webmvc

如果您仅将启动器包含到 Kotlin 项目中

implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0-M1")
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常并生成 Swagger UI。但目前似乎还没有相应的里程碑版本springdoc-openapi-kotlin