我们使用的是API优先使用的方法,而我们的服务的API则是在swagger Yamls中定义的。然后,我们使用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定义(例如添加微服务字段)还可以再次构建,并且无需手动更新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)可能因微服务而异。

有什么好的方法的想法吗?

干杯

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

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

最佳答案

因此,对于openapi来说,生成XML注释的第一件事是需要在配置中将withXml标志设置为true

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

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

我认为这是一个好方法,原因有两个:

  • 如果openapi yaml已更改,例如新字段被添加到XML或类似的内容中,无需更改微服务的代码以反映新字段,只需重新构建/重新部署即可。
  • 它反映了层的差异,生成的模型反映了Http层上发生的事情,而派生的模型反映了数据库层上需要的东西。
  • 10-07 16:39