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

cod*_*e99 1 swagger-ui spring-boot openapi springdoc springfox-boot-starter

之前在 SpringBoot v2.5.7 中,我有这个 Spring REST 控制器方法。它有一个TestCriteriaDTO 类型作为路径参数。

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

}
Run Code Online (Sandbox Code Playgroud)

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

public class TestCriteria {
    @ApiModelProperty(allowEmptyValue = true)
    List<Language> langauges;
    
}
Run Code Online (Sandbox Code Playgroud)

我使用了 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;

}
Run Code Online (Sandbox Code Playgroud)

现在 Swagger UI 不再显示languages为可选择值的字段,而是显示为对象。 在此输入图像描述

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

以前的 API 文档 -

  parameters:
    - name: languages
      in: query
      required: false
      type: array
      items:
        type: string
        enum:
          - EN
          - FR
      collectionFormat: multi
      enum:
        - EN
        - FR
Run Code Online (Sandbox Code Playgroud)

新的 API 文档 -

parameters:
  - name: testCriteria
    in: query
    required: true
    schema:
      $ref: '#/components/schemas/TestCriteria'
Run Code Online (Sandbox Code Playgroud)

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

cod*_*e99 5

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

\n

\n

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

\n
@GetMapping(path = "/test")\npublic void test(@ParameterObject TestCriteria testCriteria) {\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Springfox 到 Springdoc 迁移文档对此进行了解释:

\n
\n

如果您\xe2\x80\x99 使用对象来捕获多个请求查询参数,请使用 注释该方法参数@ParameterObject

\n
\n