我们使用的是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
和数据库注释。
我认为这是一个好方法,原因有两个: