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

时间:2019-03-12 10:57:37

标签: java spring-boot microservices openapi openapi-generator

我们使用的是API优先使用的方法,而我们的服务API则以大头贴字母yaml定义。然后,我们使用Openapi生成器来生成必须由微服务实现的接口。而且,模型是从模式生成的。

这是问题的出处。在一个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...注释?

我要执行此操作的主要原因(使用自动生成的表格形式)是因为这是一个较大的体系结构,如果有人更改yaml中的API定义,例如添加字段microservice( s)也将再次构建,并且无需手动更新java类即可更新模型。我想到的另一种方法是像Openapi那样生成模型,然后用自己的类扩展它们并在以后以某种方式添加注释,...但是我想不出任何方法来做到这一点,从而不必更改派生类。如果定义中的字段发生更改,则为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-设置getter / setter并使用属性对其进行注释,但这意味着我必须接触每个使用由定义的模型派生的微服务。 API。我不能将派生类移入API项目,因为上下文(在本例中为XML / mongo)可能因微服务而异。

有什么好的方法吗?

欢呼

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

深入研究之后,我更加确定,正确的方法可能是按照文档中提到的方式在svagger yaml中添加XML映射(@XmlAttribute / @XmlElement)批注,然后在微服务代码中对其进行扩展以添加数据库注释。基本上像第二个示例一样,只是在基类中XML注释将已经由swagger代码生成。但是,在构建模式/模型时,我还没有设法使招摇的代码生成任何XML注释。

0 个答案:

没有答案