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

vmdwslir  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(386)

以前在SpringBootv2.5.7中,我有这个SpringREST控制器方法,它有一个TestCriteria类型的DTO作为路径参数。

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

}

TestCriteria类是这样的(Language是一个枚举,可以接受ENFR)。

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

我使用了Springfox Swagger(springfox-boot-starter v3),Swagger的用户界面看起来是这样的:

但是后来我不得不将SpringBoot升级到v3,并为Swagger使用Springdoc和OpenAPI v3。现在TestCriteria类看起来像这样:

public class TestCriteria {

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

}

现在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

新API文档-

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

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

rdlzhqv9

rdlzhqv91#

终于得到了 Swagger 的用户界面显示如预期。

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

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

}

Springfox to Springdoc migration doc中对此进行了解释:
如果您使用一个对象来捕获多个请求查询参数,请使用@ParameterObject注解该方法参数。

相关问题