3

APIファーストのアプローチを使用しており、サービスのAPIはswagger yamlで定義されています。次に、Openapi ジェネレーターを使用して、マイクロサービスによって実装する必要があるインターフェイスを生成します。また、モデルはスキーマから生成されます。

ここで問題が発生します。REST エンドポイントの 1 つで、Spring-boot によってモデルに解析される XML を使用してから、データベースに保存します。現時点では、次のようなモデルを使用しています。

@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 の解析に使用できず、データベースに保存できません。@Id@Documentおよびいくつかの@Xml...注釈を追加するようにyamlに指示する方法はありますか?

私がこれをやろうとしている主な理由 (swagger から自動生成されたモデルを使用) は、これがより大きなアーキテクチャであるためです。誰かが yaml の API 定義を変更したり、たとえばマイクロサービスがフィールドを追加したりすると便利です。また、再度ビルドすると、Java クラスを手動で更新しなくてもモデルが更新されます。私が考えたもう 1 つの方法は、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 命名の場合は問題なく名前が生成されることXML: name/attributeがわかりましたが、yaml でプロパティを使用しても、生成された Java コードに影響を与えないようです (または、これを試してみて、何か間違ったことをしています: Documentation )

私が考えることができる唯一のことは@Override、ゲッター/セッターに属性を付けて注釈を付けることですが、それは、API によって定義されたモデルの派生物を使用するすべてのマイクロサービスに触れなければならないことを意味します。コンテキスト (この場合は XML/mongo) はマイクロサービスごとに大きく異なる可能性があるため、派生クラスを API プロジェクトに移動することはできません。

これに対する良いアプローチに関するアイデアはありますか?

乾杯

- - - 編集 - - -

@XmlAttributeより深く掘り下げた後、ドキュメントに記載されている方法で XML マッピング ( / @XmlElement) アノテーションを swagger yaml に追加し、それをマイクロサービス コードで拡張してデータベースを追加することがおそらく正しいアプローチであると確信しています。注釈。基本的に 2 番目の例と同様に、基本クラスでは XML 注釈が既に swagger codegen によって生成されているという点だけです。ただし、スキーマ/モデルを構築するときに、swagger codegen に XML 注釈を生成させることはまだできていません。

4

1 に答える 1