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 楼答案
我还没有找到一种使用注释的方法,即通过注释类
我认为可以通过以下方式实现:
我说的“模型”是指
io.swagger.v3.oas.models.media.Schema
的一个实例特别是我认为您应该创建并注入一个
io.swagger.v3.oas.models.media.ComposedSchema
实例,它支持allOf
这样做(即创建模型实例)与手工编写YAML没有太大区别
我没有尝试过的另一种可能性可能是编写一个稍微不同的ModelConverter,您可以将其安装到转换器链中。然后,拦截对
resolve
的调用,该调用返回一个SchemaObject,其name
是Betrag
,并且(有时是?)将其替换为使用allOf
的ComposedSchema
实例