You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot3升级后Springdoc OpenAPI查询参数枚举选择失效问题

问题描述

在SpringBoot v2.5.7版本中,使用Springfox Swagger(springfox-boot-starter v3)时,编写了如下REST控制器方法,以TestCriteria作为查询参数DTO:

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

}

TestCriteria类定义如下(Language为仅支持EN、FR的枚举):

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

此时Swagger UI中languages字段会显示为可选择枚举值的下拉框。

升级至SpringBoot v3并改用Springdoc + OpenAPI v3后,修改TestCriteria类为:

public class TestCriteria {
    @Schema(type="array")
    @Parameter(allowEmptyValue = true)
    List<Language> 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展示效果,让用户能从枚举列表中选择值,而非通过对象形式输入。

解决方案

要让Springdoc将DTO字段展开为独立的查询参数并显示枚举选项,需按以下步骤修改:

  1. 在控制器方法的DTO参数上添加@ParameterObject注解
    这个注解会告诉Springdoc将DTO的每个字段转换为单独的查询参数,而非将整个DTO作为一个对象参数处理。修改后的控制器方法:
@GetMapping(path = "/test")
public void test(@ParameterObject TestCriteria testCriteria) {

}
  1. 修正TestCriteria类的注解
    移除字段上的@Parameter注解(该注解用于单个参数,不适合DTO字段),保留@Schema并配置正确的枚举展示属性:
public class TestCriteria {
    @Schema(allowEmptyValue = true, enumAsRef = false)
    List<Language> languages;
}
  • enumAsRef = false:确保枚举值直接嵌入到OpenAPI文档中,而非引用组件定义,这样Swagger UI会生成下拉选择框。
  • 若Language枚举类未显式配置,确保它是public的标准枚举即可:
public enum Language {
    EN, FR
}
  1. 验证效果
    修改完成后,生成的OpenAPI定义会和旧版本类似,languages会作为独立的查询参数出现,带有枚举选项,Swagger UI中也会恢复下拉选择的展示形式。

内容的提问来源于stack exchange,提问作者Ishara M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:10:28