使用 Spring Boot 3 的开放 API 时出现 NoClassDefFoundError

问题描述 投票:0回答:5

我升级到 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
的问题吗,还是我接线有问题?

spring-boot openapi springdoc springdoc-openapi-ui
5个回答
6
投票

升级后也有同样的问题。

您只需要添加一个依赖项 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


1
投票

在我的例子中(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>

然后效果很好。


0
投票

根据 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>

0
投票

我在从 springboot2 迁移到 springboot 3 时也遇到了类似的问题,我按照建议添加了

springdoc-openapi-starter-webmvc-ui
然后我遇到了上述问题,在调查依赖树时我发现
springdoc-openapi-ui:1.7.0
位于通过 Maven 传递依赖功能的路径中。 因此,只需排除以下依赖项,然后一切都会顺利进行。


0
投票

我遇到了同样的问题:我已经从 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 错误页面。 请发送帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.