有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Swagger/OpenapiAnnotations:如何使用$ref生成allOf?

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

虽然它可以很好地处理基本类型,但我在自定义类方面有一些问题

现在我有很多自定义类的重复模式条目(使用@schema(implementation=MyClass.class)),但至少有必要的信息。但是,我想找到一种方法来删除重复的模式条目,同时保留附加信息

在github上讨论了$ref和缺少同级属性的问题,我发现了an example如何在yaml中手动编写它以获得我想要的结果,但是我不知道如何设置注释来生成它

这就是我认为如果我遵循example(为了安全起见,它被添加到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'

任何提示都是非常受欢迎的


共 (1) 个答案

  1. # 1 楼答案

    我还没有找到一种使用注释的方法,即通过注释类


    我认为可以通过以下方式实现:

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

    我说的“模型”是指io.swagger.v3.oas.models.media.Schema的一个实例

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

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


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