我们使用的是API优先的方法,我们服务的API在swagger 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 children;
@XmlElement("otherChildName")
private List children2;
}
其他型号都很相似。我喜欢这个,因为Spring boot可以使用它来自动解析传入的XML,我可以将这个模型直接保存到数据库中,并将其作为JSON返回。
Openapi生成器生成的模型缺少注释,因此无法用于解析XML,也无法保存到数据库中。山药里有没有办法让它加上
@Id
@Document
还有一些
@Xml...
注解?
我尝试这样做的主要原因(使用自动生成的模型表单招摇过市)是因为这是一个更大的体系结构,如果有人更改yaml中的API定义,例如添加字段,那么microservice也将再次构建,并且模型将在不手动更新java类的情况下更新。我考虑的另一种方法是像Openapi那样生成模型,然后用自己的类扩展它们,然后以某种方式添加注释,。。。但我想不出任何方法来实现这一点,这样,如果定义中的字段发生更改,就不必更改派生类。
例子:
//class generated by openapigenerator
public class Model {
private String field;
private List 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。。。
@JsonProperty("somename")
在json命名的情况下,名称很好,但它似乎使用了
XML: name/attribute
yaml中的属性对生成的java代码没有任何影响(或者我做错了什么,请尝试:
Documentation
)
我唯一能想到的就是
@Override
-使用getter/setter并用属性注释它们,但这意味着我必须接触每个使用API定义的模型派生的微服务。我无法将派生类移到API项目中,因为上下文(在本例中是XML/mongo)可能因微服务而异。
有什么好办法吗?
-----编辑------
在深入研究之后,我更加确信可能正确的方法是添加XML映射(
@XmlAttribute
@XmlElement