gpt4 book ai didi

java - 如何使用 Openapi Generator 从 Swagger yaml 生成 SpringBoot 模型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:17 25 4
gpt4 key购买 nike

我们正在使用 API 优先方法,我们服务的 API 是在 swagger yaml 中定义的。然后,我们使用 Openapi 生成器生成必须由微服务实现的接口(interface)。此外,模型是从模式生成的。

这就是问题所在。在其中一个 REST 端点中,我使用了一个 XML,让 Spring-boot 将其解析为模型,然后将其保存到数据库中。目前我使用的模型看起来像这样:

@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Document("MyModel")
public class Model {

@Id
@XmlTransient
private String id;

@XmlAttribute
private String someAttribute;

@XmlElement("childName")
private List<OtherModel> children;

@XmlElement("otherChildName")
private List<OtherModel2> children2;

}

与其他模型非常相似。我喜欢这个,因为 Spring-boot 可以使用它来自动解析传入的 XML,我可以将这个模型直接保存到数据库并将其作为 JSON 返回。

Openapi Generator 生成的模型缺少注解,因此无法用于解析 XML,也无法保存到数据库中。 yaml 中是否有任何方法告诉它添加 @Id@Document 和一些 @Xml... 注释?

我尝试这样做的主要原因(使用自动生成的模型形式 swagger)是因为这是一个更大的架构,如果有人更改 yaml 中的 API 定义,例如添加字段微服务( s) 也将再次构建,并且无需手动更新 java 类即可更新模型。我想到的另一种方法是按照 Openapi 的方式生成模型,然后用自己的类扩展它们,然后以某种方式添加注释,......但我想不出任何方法来做到这一点,这样你就不必更改派生的如果定义中的字段发生更改,则为类。

例子:

//class generated by openapigenerator
public class Model {
private String field;
private List<Submodel> children

//autogenerated getters/setters
}

//model in my code
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Document("MyModel")
public class MyModel extends Model {

@Id
@XmlTransient
@Getter
@Setter
private String id;

}

这没问题,但缺少某些字段上的 @Xml... 注释。我已经看到它在 json 命名的情况下生成 @JsonProperty("somename") 名称就好了,但它似乎在 yaml 中使用了 XML: name/attribute 属性对生成的 Java 代码没有任何影响(或者我做错了什么,试试这个:Documentation)

我唯一能想到的是 @Override -ing getter/setter 并用属性注释它们,但这意味着我必须接触每个使用派生的微服务API 定义的模型。我无法将派生类移动到 API 项目中,因为上下文(在本例中为 XML/mongo)可能因微服务而异。

对此有什么好方法吗?

干杯

----- 编辑 ------

在深入挖掘之后,我越来越确定可能正确的方法是在 swagger yaml 中添加 XML 映射 (@XmlAttribute/@XmlElement) 注释文档中提到的方式,然后在微服务代码中扩展它以添加数据库注释。基本上就像第二个例子一样,在基类中,XML 注释已经由 swagger codegen 生成。但是,在构建模式/模型时,我还没有设法让 swagger codegen 生成任何 XML 注释。

最佳答案

因此,要让 openapi 生成 XML 注释,您首先需要在配置中将 withXml 标志设置为 true

我采用了在 openapi yaml 文件中使用 XML 规范的方法来生成一个带有 XML 注释的模型,Spring Boot 使用该模型来解析传入的 XML 文件。

然后我像在第二个示例中一样派生了另一个类并添加了 id 和数据库注释。

我认为这是一个很好的方法,原因有二:

  1. 如果更改了 openapi yaml,例如新字段被添加到 XML 或类似的东西,微服务的代码不必更改以反射(reflect)新字段,只需重建/重新部署。
  2. 它反射(reflect)了层的差异,生成的模型反射(reflect)了 Http 层上发生的事情,而派生模型反射(reflect)了数据库层上的需求。

关于java - 如何使用 Openapi Generator 从 Swagger yaml 生成 SpringBoot 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com