Swagger/OpenAPI注释:如何使用$ref生成allOf?

7

我正在生成包括添加Openapi/Swagger注解在内的REST端点的代码。

虽然用基本类型很好用,但对于自定义类我有一些问题。

现在,我有很多自定义类的重复模式条目(使用@Schema(implementation = MyClass.class)),但至少所需的信息已经存在。然而,我想找到一种方法删除重复的模式条目同时保留额外的信息

在讨论$ref和缺乏同级属性的github问题上,我发现了一个示例,说明了您如何手动编写yaml以获得我所寻找的结果,但是我无法弄清楚如何设置注释以生成它。

如果按照示例进行操作,这就是我认为注释应该是什么样子的(为了安全起见,它被添加到getter和setter中):

  import io.swagger.v3.oas.annotations.media.Schema;

  ...
public class SepaPaymentRequest {
  ...

  @Schema(name = "w307BetrBeg", description = "BETRAG BEGUENSTIGTER ", allOf = { com.diesoftware.services.utils.Betrag.class }, required = true)
  public void setW307BetrBeg(final Betrag w307BetrBeg) {
    this.w307BetrBeg = w307BetrBeg;
  }

  ...
}

然而,当我获取 openapi.yaml 文件时(片段):

    w307BetrBeg:
      $ref: '#/components/schemas/Betrag'

我希望拥有的:

    w307BetrBeg:
      title: 'Betrag'
      description: 'BETRAG BEGUENSTIGTER'
      allOf:
        - $ref: '#/components/schemas/Betrag'

欢迎提供任何提示。


你有没有得到过答案? - More Than Five
目前还没有任何进展,大约一个月前我在GitHub上提交了一个问题(issue),但是至今仍然没有回应。 - Peter S
1个回答

0

我还没有找到一种使用注解的方法来实现它,即通过对类进行注释。


我认为这是可能的,方法如下:

  • 创建一个模型
  • 使用ModelConverter注入模型

当我说“模型”时,我指的是io.swagger.v3.oas.models.media.Schema的实例。

特别是,我认为您需要创建和注入一个io.swagger.v3.oas.models.media.ComposedSchema实例,它支持allOf

这样做(即创建模型实例)与手写YAML并没有太大区别。


另一种可能性——我还没有尝试过——是编写一个稍微不同的ModelConverter,并将其安装到转换器链中。然后,拦截返回其名称为“Betrag”的SchemaObject的resolve调用,并有时将其替换为使用allOf的ComposedSchema实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接