【问题标题】:Is there any Spring Boot with Jersey framework that supports OpenAPI 3.0?是否有支持 OpenAPI 3.0 的带有 Jersey 框架的 Spring Boot?
【发布时间】:2019-12-25 03:37:57
【问题描述】:

有大量关于 Spring Boot、JAX-RS 和 Swagger 的教程。但是,它们中的大多数似乎都使用 OpenAPI 2 规范。我只找到了一个使用 Spring、JAX-RS 和 OpenAPI 3.0 的教程(该教程使用了 Apache CXF)。

https://dzone.com/articles/moving-with-the-times-towards-openapi-v300-adoptio

其他 Spring Boot + JAX-RS 实现是否适用于 OpenAPI 3.0?例如,所有带有 Jersey 的教程似乎都只输出 OpenAPI 2.0。 Apache CXF 适合我正在做的事情,但我想知道是否有选择。

Springdoc-openapi 支持 spring boot 和 OpenAPI 3.0,不确定 jaxrs。 https://github.com/springdoc/springdoc-openapi

【问题讨论】:

  • 自从您在这里发布问题后,您有没有发现什么有趣的事情?

标签: spring-boot jersey swagger cxf openapi


【解决方案1】:

使用生成 OpenAPI 3.0 规范的 JAX-RS 配置 Spring Boot

您可以使用 SwaggerSpring BootJAX-RS 一起生成 OpenAPI 3.0以下:

  1. pom.xml 中包含spring-boot-starter-jerseyswagger-coreswagger-annotationsswagger-jaxrs
  2. 扩展ResourceConfig并配置包以扫描JAX-RS注解并注册SwaggerOpenAPIResource.class
  3. 使用 Swagger Annotations 注释您的端点和架构。
  4. 如果您想通过/swagger-ui.html 访问Swagger,可以选择包含sprindoc-openapi-ui

1) pom.xml 中的依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>io.swagger.core.v3</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>
        <groupId>io.swagger.core.v3</groupId>
        <artifactId>swagger-core</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>
        <groupId>io.swagger.core.v3</groupId>
        <artifactId>swagger-jaxrs2</artifactId>
        <version>${swagger.version}</version>
        <exclusions>
            <exclusion>
                <groupId>io.github.classgraph</groupId>
                <artifactId>classgraph</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.2.18</version>
    </dependency>

当前swagger-version2.1.0

springdoc-openapi-uiswagger-jaxrs2 存在冲突,导致io.github.classgraph 出错,因此必须从swagger-jaxrs2 中排除此库。

2:扩展资源配置

@Component
@ApplicationPath("/api")
@Path("/")
public class JaxRsConfig extends ResourceConfig {
    public JaxRsConfig() {
        // register resources
        packages("com.example.jaxrs.resources");
        register(OpenApiResource.class);
    }
}

JAX-RS 注释资源必须通过调用packages("com.example.jaxrs.resources") 进行扫描。

小心,不要与 register 函数混淆!

OpenApiResource.class 来自 Swagger 并提供 /openapi.json 端点。

我之所以将/api 用作@ApplicationPath 是因为与springdoc-openapi-ui 一起使用时,@ApplicationPath 设置为“/”时找不到swagger-ui.html 端点。在这种情况下,似乎有些东西被覆盖了。也许有人对此有解释。

3) Swagger 注释

@Schema(name = "Message", description = "This is an object to place a message.")
public class MessageDto {

    @Schema(name="Message", required = true)
    private String message;

    public MessageDto(String message) {
        super();
        this.message = message;
    }
    // ... getters and setters
}

4) 配置SpringDoc

默认情况下,您应该可以调用 /swagger-ui.html 打开 Swagger 并浏览您的 OpenAPI 3.0 定义。

由于@ApplicationPath 设置为/api,我们需要通过在application.properties 中设置属性来配置SpringDoc 在哪里查找定义:

springdoc.api-docs.path=/api/openapi.json

您还可以更改 Swagger 的 URL:

springdoc.swagger-ui.path=/swagger-ui.html

其他问题:

将应用程序作为.jar 文件运行时,可能会出现另一个问题:

Spring boot application won't run when trying to run from the jar file

在这种情况下,我找到了一个解决方案,方法是使用像 org.reflections 这样的反射库扫描所有组件,如下所示:

    private void scan(String... packages) {
        for (String packageName : packages) {
            Reflections reflections = new Reflections(packageName);
            reflections.getTypesAnnotatedWith(Provider.class).parallelStream().forEach(clazz -> register(clazz));
            reflections.getTypesAnnotatedWith(Path.class).parallelStream().forEach(clazz -> register(clazz));
        }
    }

【讨论】:

  • 这是一个很大的帮助。问题:当我尝试加载 swagger-ui.html 时,它重定向到 /swagger-ui/index.html?configUrl=/api/openapi.json/swagger-config 但是,swagger-config 没有任何内容。我是否缺少任何配置?
  • @Vijay 我很想知道你是否解决了这个问题
  • 根据 Spring 文档,它不支持 Jersey API。
【解决方案2】:

添加答案,因为我无法评论或编辑。

问题:当我尝试加载 swagger-ui.html 时,它重定向到 /swagger-ui/index.html?configUrl=/api/openapi.json/swagger-config 但是,swagger-config 没有任何内容。我是否缺少任何配置?

我也有这个问题。我可以通过将以下属性添加到我的 application.properties 来修复它:

springdoc.swagger-ui.display-query-params=true

问题很奇怪,不知何故,解决方案甚至更奇怪。但是,嘿,它有效!

【讨论】:

    猜你喜欢
    • 2022-06-03
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2021-08-26
    相关资源
    最近更新 更多