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 视图,其中用户可以从枚举列表中选择一个值,而不是通过对象表示获取用户的输入?
终于按照预期显示了 Swagger UI。
\n\n在控制器方法参数中,我们需要添加@ParameterObject:
@GetMapping(path = "/test")\npublic void test(@ParameterObject TestCriteria testCriteria) {\n\n}\nRun Code Online (Sandbox Code Playgroud)\nSpringfox 到 Springdoc 迁移文档对此进行了解释:
\n\n\n如果您\xe2\x80\x99 使用对象来捕获多个请求查询参数,请使用 注释该方法参数
\n@ParameterObject。
| 归档时间: |
|
| 查看次数: |
4613 次 |
| 最近记录: |