当前位置: 首页 > 知识库问答 >
问题:

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

柳胡媚
2023-03-14

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

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

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

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

共有1个答案

黄流觞
2023-03-14

我还没有找到使用注释来完成它的方法,即通过注释类。

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

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

当我说“模型”时,我指的是io的一个实例。大摇大摆v3。美洲国家组织。模型。媒体模式

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

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

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

 类似资料:
  • 我正在使用从以下依赖项导入的Swagger/OpenAPIV3注释创建应用程序的API描述: 其中一个批注是批注,它接受名为的属性,该属性允许字符串数组: 现在,我想使用在枚举类上构造的自定义方法,该方法返回允许的字符串数组,因此不需要在每次向枚举添加类型时添加该方法。以便我们可以这样使用它: 现在这是无法编译的,因为在执行注释时不知道该方法。是否有这样的解决方案允许在SwaggerV3注释属性值

  • 当我访问我的Swagger UIendpoint时,我会看到这个服务的记录良好的条目,包括关于和参数的信息。现在,我试图以类似的方式创建和方法,但遇到了一个问题。 由于我的/请求包含许多表单参数,所以我将它们封装到一个对象中,并用注释该方法。我的表单对象如下所示: 我的方法如下所示: 什么也没做。我尝试将方法签名更改为如下所示: 还是什么都没有。我的问题是,是否有一种方法可以让OpenAPI/Sw

  • OpenAPI3.0规范规定,没有任何类型的模式将匹配任何数据类型。 没有类型的模式匹配任何数据类型--数字、字符串、对象等等。 因此,对此进行建模的正确方法是下面的Swagger定义,其中没有属性: 但是,每个开放问题Swagger-core#3834,Java值都映射到OpenAPI类型,而不是任意类型。如上所述,这意味着这样的API返回或接受不是OpenAPI的类型是不正确的,例如、、等。

  • 我在一个带注释的对象中有几个枚举,如: 其中枚举定义为: 使用Openapi3,我可以生成一个swagger文档。我的问题是,和,翻译方式不同,如: 我希望< code>Enum2与< code>Enum1一样被记录,因此具有实际的枚举值。有什么方法可以强制这样做,或者解释为什么会这样?两个枚举基本上与示例中的相同。

  • 我们正在考虑为我们的项目使用grails 4.0.0,我看到这个新版本将Micronaut作为新的父应用程序上下文,并且处理了许多Micronaut特性(见grails doc:http://docs.grails.org/latest/guide/introduction.html#micronautSupport) 我们希望使用Micronaut Swagger/OpenAPI文档生成器功能(

  • 我目前正在做一个项目,在这个项目中我使用了spring functional web编程。我通常在restController中使用swagger 2的注释,但是对于函数式web编程,我找不到在哪里!告诉应用程序搜索endpoint(如Docket中的basepackage)并在html页面中加载swagger的地方。以下是我的代码: 配置类: 依赖项: 结果是: