【问题标题】:How to achieve nullable enums?如何实现可为空的枚举?
【发布时间】:2022-10-25 15:30:44
【问题描述】:

我正在努力生成一个包含可为空枚举的 API 文档。

设置

我们有一个接受请求的端点,这个请求包含一个可以为空的枚举类型的字段。所以想象一下这样的事情:

class Request {
  @Nullable
  @Schema(nullable = true, example = "RED")
  private Color color;
}

enum Color {
  RED,
  GREEN,
  YELLOW
}

一旦我们使用 springdoc-openapi 生成 swagger api 定义,我们就会得到以下 yml:

[...]
components:
  schemas:
    Request:
      type: object
      properties:
        color:
          type: string
          nullable: true
          example: RED
          enum:
          - RED
          - GREEN
          - YELLOW # missing entry for null

这允许请求省略 color 属性,但是如果有人发送 color = null,根据 api,这不是一个有效的请求,因为 null 没有作为枚举中的值列出。

我正在使用 springdoc-openapi 版本 1.6.11。

问题

因为像 @NotNull 这样的注释也会被选中,我希望 @Nullable 也会被选中,因此应该将 null 添加到可能的值列表中。或者我怎样才能实现一个允许 null 作为有效输入的枚举?

任何帮助深表感谢。

其他信息

我已经尝试找到解决方法,但没有成功。我尝试将 null 添加到 Schema 注释中的 allowableValues 中,但这是不允许的,因为错误属性值必须是常量错误弹出。

可能与此 GitHub 问题有关:https://github.com/swagger-api/swagger-core/issues/3945

【问题讨论】:

    标签: springdoc


    【解决方案1】:

    它是GET方法的查询参数吗?
    如果查询参数的形式为color=null,则 null 被识别为字符串,因此它会抛出 IllegalArgumentException(No enum constant) 以从 Enum 中查找 null 值。

    color= 形式的值将被视为 null。
    例如curl "http://localhost:8080/hello?color="

    这是我尝试过的代码。

    @RestController
    @RequestMapping("hello")
    public class HelloController {
      @GetMapping
      public String index(@Nullable @Schema(nullable = true, example = "RED") Color color) {
        System.out.println(color); // null
        return "Hello";
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多