Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

Pet*_*r S 6 java swagger openapi

我正在生成 Rest 端点,包括向生成的代码添加Openapi/Swagger注释。

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

现在我有很多自定义类的重复模式条目(使用@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;
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我获取 openapi.yaml(代码段)时我得到了什么:

    w307BetrBeg:
      $ref: '#/components/schemas/Betrag'
Run Code Online (Sandbox Code Playgroud)

我想要什么:

    w307BetrBeg:
      title: 'Betrag'
      description: 'BETRAG BEGUENSTIGTER'
      allOf:
        - $ref: '#/components/schemas/Betrag'
Run Code Online (Sandbox Code Playgroud)

任何提示都非常受欢迎。

Chr*_*isW 0

我还没有找到使用注释(即通过注释类)来完成此操作的方法。


我认为可以通过以下方式做到:

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

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

特别是,我认为您想要创建并注入一个io.swagger.v3.oas.models.media.ComposedSchema支持allOf.

执行此操作(即创建模型实例)与手写 YAML 没有太大区别。


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