swagger 我如何在openapi.json中添加一个enum包含参数?

yjghlzjz  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(137)

我有一个带有多个参数的枚举。

public enum MyEnum {
   VALUE_1("value1_string_1", "value1_string_2");

   private final String argument1;
   private final String argument2;

   MyEnum (String argument1, String argument2) {
        this.argument1 = argument1;
        this.argument2 = argument2;
   }

   public String getArgument1() {
       return argument1;
   }

   public String getArgument2() {
       return argument2;
   }
}

字符串
作为REST-API一部分的DTO将这两个参数的值用于其字段。字段1用参数1设置,字段2用参数2设置。

public class MyDTO {
  private String field1;
  private String field2;
  ...
}
...
MyDTO myDto = new MyDTO();
myDto.setField1(VALUE_1.getArgument1())
myDto.setField2(VALUE_1.getArgument2())


我怎样才能将包含参数的枚举添加到openapi.json中?
我知道我可以使用@Schema(..., implementation = MyEnum.class) private String field1;,但这将只包括没有参数的枚举值,如:

"field1" : {
   "type" : "string",
   "enum" : [ "VALUE_1" ]
}


此外,参数1和参数2之间的连接不应丢失。API的用户应该能够看到“value1_string_1”和“value1_string_2”属于同一个属性。
枚举值(包括参数)应该自动添加到openapi.json中,以确保它始终是最新的。这意味着添加类似于这个答案Swagger/openapi add @Schema(description) to each enum value的描述并不能解决问题。
我认为@Schema(... ref = "#/components/schemas/MyEnum/properties/argument1" ) private String field1;可能是解决方案的一部分。但是,如果带参数的枚举不在openapi.json中,则引用是无用的。
应用程序使用以下swagger依赖项:

<dependency>
  <groupId>io.swagger.core.v3</groupId>
  <artifactId>swagger-annotations</artifactId>
  <version>2.2.7</version>
</dependency>

tpgth1q7

tpgth1q71#

表面上的问题是,在枚举代码中,你使argument1和argument2final。这意味着对于枚举的该示例,它们只能被赋值一次。然后,为该枚举常量分配初始值“value1_string_1”和“value1_string_2”(发布的代码有点不完整,但我假设您的实际枚举代码处于工作状态,复制粘贴在发布时没有正确捕获它)。因此,如果你想给argument1和argument2分配不同的值,那么你需要从它们的声明中删除final
第二部分是枚举可能不是您在这里要使用的工具。枚举示例有一个特殊的构造过程,它保证每个decalred枚举常量在程序的生存期内只示例化一次。我有一种感觉,在使用json框架时,你真的应该使用一个普通的类而不是枚举。在创建您可能需要的类的示例时,有更多的自由度。

相关问题