OpenAPI Generator で生成した Class にアノテーションを追加する ( Spring )

2024年5月28日

Spring を利用した Rest Api を実装している際に生成した Class に @Builder などがなく使いにくかったためそれを追加する方法をまとめておきます。

はじめに

はじめに、今回実装していたアプリケーションでは OpenAPI Generator によって Controller の IF と Request / Response の Class までを自動生成しています。 API の 仕様となる yaml から直接生成できるため常に IF が保たれるという利点があります。 ただ今回生成された Class に必要なアノテーションが無くそれを追加する際に少々面倒だったのでその方法を残しているという感じです。

もっと良い方法あれば教えてください。

OpenAPI Generator の Clone

まず公式のGitHub から Clone してきます。今回は Spring を使っているので変更対象は JavaSpring のディレクトリになります。

テンプレートの変更

上記 JavaSpring のディレクトリ内の model.mustache と pojo.mustache を修正していきます。

今回は Builder と AllArgsConstructor を追加します。

テンプレートなので実際に生成される Class と見比べるとどこに追加するべきかは分かりやすいと思います。

// 以上省略
import java.util.*;
import {{javaxPackage}}.annotation.Generated;
// 以下追加
import lombok.Builder;
import lombok.AllArgsConstructor

{{#models}}
{{#model}}
// 以下省略
// 以上省略
{{>generatedAnnotation}}
{{#vendorExtensions.x-class-extra-annotation}}
{{{vendorExtensions.x-class-extra-annotation}}}
{{/vendorExtensions.x-class-extra-annotation}}
@Builder; //追加
@AllArgsConstructor //追加
public class {{classname}}{{#parent}} extends {{{parent}}}{{/parent}}{{^parent}}{{#hateoas}} extends RepresentationModel<{{classname}}> {{/hateoas}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#serializableModel}}
// 以下省略

Jar の生成から配置まで

ここまでできたらあとは上記公式の Git の README にある通り mvn コマンドなりで jar を生成します。

openapi-generator-cli 配下にできる target ディレクトリの中にできる openapi-generator-cli.jar をコード生成したいプロジェクトに配置して使用すると今回追加したアノテーションを追加した状態で Class の生成を行ってくれます。

まとめ

今回はアノテーションの追加などデフォルトのテンプレートに含まれていない機能を追加したい場合の処理をメインで記載していきました。実際のコード生成の詳細の処理などはこの辺りの記事で紹介されている様です。こちらで使われている openapi-generator-cli.jar を今回生成した jar にすれば問題なく動かせるはずです。

mustache ファイルなど普段あまり使うことの少ない形式で書かれているファイルなのでやや扱いにくそうな印象を受けましたがコードの自動生成自体は非常に有益だと思うので使いこなせるようになっておきたいといった感じですかね。

参考書籍