我们使用的是 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 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...
某些字段上的注释。我已经看到它@JsonProperty("somename")
在 json 命名的情况下生成 name 就好了,但似乎使用XML: name/attribute
yaml 中的属性对生成的 java 代码没有任何影响(或者我做错了什么,试试这个:Documentation)
我唯一能想到的就是使用@Override
getter/setter 并用属性对其进行注释,但这意味着我必须接触每个使用 API 定义的模型的派生的微服务。我无法将派生类移动到 API 项目中,因为上下文(在本例中为 XML/mongo)可能因微服务而异。
关于这个的好方法有什么想法吗?
干杯
- - - 编辑 - - -
在深入挖掘之后,我越来越确定正确的方法可能是按照文档中提到的方式在 swagger yaml 中添加 XML 映射(@XmlAttribute
/ @XmlElement
)注释,然后在微服务代码中扩展它以添加数据库注释。基本上与第二个示例一样,只是在基类中 XML 注释已经由 swagger codegen 生成。但是,在构建模式/模型时,我还没有设法让 swagger codegen 生成任何 XML 注释。