Spring Boot 使用Sping Boot 3的Open API时出现NoClassDefFoundError

64jmpszr  于 2023-05-28  发布在  Spring
关注(0)|答案(2)|浏览(713)

我升级到Sping 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

当我查看org.springdoc:springdoc-openapi-webmvc-core:1.7.0 jar中的OpenApiWebMvcResource时,它确实从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的问题,还是我的接线出错了?

yks3o0rb

yks3o0rb1#

升级后也有同样的问题。
您只需要添加一个依赖项,即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并生成文档。
https://springdoc.org/v2/#spring-webmvc-support

7cjasjjr

7cjasjjr2#

根据Spring Doc /v2 guide,我只需要引入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>

相关问题