我升级到 Spring boot 3.0.7,并尝试让我的 Open API (swagger) 再次工作,并使用这些依赖项(根据 springdoc):
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
...但是当我构建我的应用程序时,出现以下错误:
java.lang.IllegalStateException: Failed to introspect Class [org.springdoc.webmvc.api.OpenApiWebMvcResource] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@1de0aca6]
...“原因”为:
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
当我查看
OpenApiWebMvcResource
jar 中的 org.springdoc:springdoc-openapi-webmvc-core:1.7.0
时,它确实是从 javax
而不是 jakarta
导入的:
package org.springdoc.webmvc.api;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Operation;
import java.util.Locale;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
...
那么这是
openapi-webmvc-core
的问题吗,还是我接线有问题?
升级后也有同样的问题。
您只需要添加一个依赖项 springdoc-openapi-starter-webmvc-api 并且不需要额外的配置。删除依赖 springdoc-openapi-ui
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
您不需要指定packagesToscan[]或不需要使用withClassAnnotation(RestController.class)),它会在寻找@RestController Annotation并生成文档时自行处理。
在我的例子中(Spring Boot 3.0.5 和 Java 17)除了添加以下内容
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
我还必须添加这个依赖项
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
然后效果很好。
根据 Spring Doc /v2 指南,我只需要引入
springdoc-openapi-starter-webmvc-ui
依赖项,而不是 springdoc-openapi-ui
。所以当我的 pom.xml 看起来像:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
...那个错误消失了,并且成功了。
请注意,无论出于何种原因,我还需要引入这些依赖项,否则我会得到一个
java.lang.NoClassDefFoundError: jakarta/xml/bind/annotation/XmlRootElement
:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>${jakarta.xml.bind.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${org.glassfish.jaxb.version}</version>
</dependency>
我在从 springboot2 迁移到 springboot 3 时也遇到了类似的问题,我按照建议添加了
springdoc-openapi-starter-webmvc-ui
然后我遇到了上述问题,在调查依赖树时我发现 springdoc-openapi-ui:1.7.0
位于通过 Maven 传递依赖功能的路径中。
因此,只需排除以下依赖项,然后一切都会顺利进行。
我遇到了同样的问题:我已经从 springboot2 迁移到 springboot 3,我按照建议添加了 springdoc-openapi-starter-webmvc-ui 然后我遇到了上述问题。如果我导航 Maven 库,我可以看到 springdoc-openapi-starter-webmvc-api 仍然引用 springdoc-openapi-ui:1.7.0。我怎样才能排除这种依赖性? 如果我像这样在 dependencyManagement 中排除此依赖项:
<dependencyManagement>
<dependencies>
<!-- Swagger -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${org.springdoc}</version>
<exclusions>
<exclusion>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
错误不再显示,但是当我导航 http://localhost:9099/swagger-ui/index.html 以测试 Swagger UI 时,会显示 Whitelabel 错误页面。 请发送帮助:)