我们使用的是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注释。