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

How to generate SpringBoot models from Swagger yaml with Openapi Generator

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

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

@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 并且我可以将这个模型直接保存到数据库并且 return 它作为 JSON。

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

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

示例:

//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/setters 并用属性注释它们,但这意味着我必须接触每个使用派生的微服务API 定义的模型。我无法将派生的 class 移动到 API 项目中,因为上下文(在本例中为 XML/mongo)可能因微服务而异。

对此有什么好的方法吗?

干杯

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

深入挖掘后,我越来越确定正确的方法可能是在 swagger yaml 中添加 XML 映射 (@XmlAttribute/@XmlElement) 注释它在文档中提到,然后在微服务代码中扩展它以添加数据库注释。基本上就像第二个例子一样,只是在基础 class 中 XML 注释已经由 swagger codegen 生成了。但是,在构建 schemas/models.

时,我还没有设法让 swagger codegen 生成任何 XML 注释

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

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

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

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

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