Swagger UI OpenAPI 3,查询参数显示为对象而不是可更改值的字段

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

之前在 SpringBoot v2.5.7 中,我有这个 Spring REST 控制器方法。它有一个

TestCriteria
类型的 DTO,作为路径参数。

@GetMapping(path = "/test")
public void test(TestCriteria testCriteria) {

}

TestCriteria
班就是这样的。 (
Language
是一个枚举,可以采用
EN
FR
)。

public class TestCriteria {
    @ApiModelProperty(allowEmptyValue = true)
    List<Language> langauges;
    
}

我使用了 Springfox Swagger (springfox-boot-starter v3),Swagger UI 看起来像这样:

但后来我不得不将 SpringBoot 升级到 v3,并使用 Springdoc 和 OpenAPI v3 for Swagger。现在

TestCriteria
类看起来像这样:

public class TestCriteria {

    @Schema(type="array")
    @Parameter(allowEmptyValue = true)
    List<Langauge> languages;

}

现在 Swagger UI 不会将

languages
显示为可选值字段,而是显示为对象。 enter image description here

我也比较了生成的 OpenAPI 定义,发现,

以前的 API 文档 -

  parameters:
    - name: languages
      in: query
      required: false
      type: array
      items:
        type: string
        enum:
          - EN
          - FR
      collectionFormat: multi
      enum:
        - EN
        - FR

新 API 文档 -

parameters:
  - name: testCriteria
    in: query
    required: true
    schema:
      $ref: '#/components/schemas/TestCriteria'

有没有一种方法可以提供以前的 Swagger UI 视图,用户可以在其中从枚举列表中选择一个值,而不是通过对象表示获取用户的输入?

spring-boot swagger-ui openapi springdoc springfox-boot-starter
1个回答
6
投票

终于按照预期显示了 Swagger UI。

在控制器方法参数中,我们需要添加

@ParameterObject
注解:

@GetMapping(path = "/test")
public void test(@ParameterObject TestCriteria testCriteria) {

}

或者,注释参数类:

@ParameterObject
public class TestCriteria {...}

这在 Springfox 到 Springdoc 迁移文档中进行了解释:

如果您使用对象来捕获多个请求查询参数,请使用

@ParameterObject
注释该方法参数。

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