3

我们使用的是 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/attributeyaml 中的属性对生成的 java 代码没有任何影响(或者我做错了什么,试试这个:Documentation

我唯一能想到的就是使用@Overridegetter/setter 并用属性对其进行注释,但这意味着我必须接触每个使用 API 定义的模型的派生的微服务。我无法将派生类移动到 API 项目中,因为上下文(在本例中为 XML/mongo)可能因微服务而异。

关于这个的好方法有什么想法吗?

干杯

- - - 编辑 - - -

在深入挖掘之后,我越来越确定正确的方法可能是按照文档中提到的方式在 swagger yaml 中添加 XML 映射(@XmlAttribute/ @XmlElement)注释,然后在微服务代码中扩展它以添加数据库注释。基本上与第二个示例一样,只是在基类中 XML 注释已经由 swagger codegen 生成。但是,在构建模式/模型时,我还没有设法让 swagger codegen 生成任何 XML 注释。

4

1 回答 1

1

因此,首先要让 openapi 生成 XML 注释,您需要在配置中withXml设置标志true

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

然后我像在第二个示例中一样派生了另一个类并添加了id和​​数据库注释。

我相信这是一个很好的方法,原因有两个:

  1. 如果 openapi yaml 发生更改,例如将新字段添加到 XML 或类似内容中,则无需更改微服务的代码以反映新字段,只需重新构建/重新部署即可。
  2. 它反映了层的差异,生成的模型反映了 Http 层发生了什么,而派生模型反映了数据库层需要什么。
于 2019-03-12T16:48:28.650 回答