以前在SpringBootv2.5.7中,我有这个SpringREST控制器方法,它有一个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的用户界面看起来是这样的:
但是后来我不得不将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视图,在那里用户可以从枚举列表中选择一个值,而不是通过对象表示获得用户的输入?
1条答案
按热度按时间rdlzhqv91#
终于得到了 Swagger 的用户界面显示如预期。
在控制器方法参数中,我们需要添加
@ParameterObject
注解:Springfox to Springdoc migration doc中对此进行了解释:
如果您使用一个对象来捕获多个请求查询参数,请使用
@ParameterObject
注解该方法参数。