きり丸の技術日記

技術検証したり、資格等をここに残していきます。

OpenAPI Generatorをカスタマイズしたコードを生成する(Swagger Codegenとほぼ同じ)

OpenAPI Generatorの使用方法については、基本的にSwagger Codegenと同じようにカスタマイズできます。

今回の記事では、OpenAPI Generatorの生成コードをカスタマイズします。

環境

  • OpenAPI-Generator-CLI
    • 6.2.0

ゴール

任意のカスタマイズしたコードを生成することがゴールです。今回の場合は、生成されるモデルにlombok@Builderを付与します。

YAMLは公式が提供しているサンプルを使用します。

修正前コード

import javax.annotation.Generated;


/**
 * A pet for sale in the pet store
 */

@Schema(name = "Pet", description = "A pet for sale in the pet store")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-25T23:28:56.822+09:00[Asia/Tokyo]")
public class Pet {
}

修正後コード

import javax.annotation.Generated;
import lombok.Builder;


/**
 * A pet for sale in the pet store
 */

@Schema(name = "Pet", description = "A pet for sale in the pet store")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-25T23:28:56.822+09:00[Asia/Tokyo]")
@Builder
public class Pet {
}

対応

ソースコードを生成できる状態にする

まずは、OpenAPI Generatorを使える状態にします。基本的には、公式GitHubを見ることが一番簡単です。

今回は、jarを直接実行して生成する方法を記載します。Maven Repositoryから最新版のjarを取得します。あとは、Javaがローカルで実行できる状態であれば問題ありません。

java -jar openapi-generator-cli-6.2.0.jar generate \
   -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml \
   -g spring \ 
   -o /output
# -i:対象のYAML
# -g:自動生成したい言語及びライブラリ
# -o:出力先ファイル

生成したいコードのテンプレートを探す

OpenAPI Generatorが提供している自動生成ソースコードのテンプレートはmustacheファイルで構成されています。テンプレートは次のディレクトリに配備されています。

今回は、JavaSpringのソースコードを生成したいので、JavaSpringの中身をダウンロードします。

そのままの階層構造のまま移植すると構造が深すぎるので、私は次のディレクトリ構造で配備しています。

  • root
    • templates
      • javaSpring

修正したいテンプレートを探す

mustacheファイルに慣れていないこともあり、この該当テンプレート探しがかなりつらいです。私は自動生成コードを元に、逆算して探しています。

今回の場合、modelのimportを制御しているmodel.mustache、modelのクラス部分を制御しているpojo.mustacheを修正します。

<!-- model.mustache -->
~~~ 省略 ~~~
{{^useJakartaEe}}
import javax.annotation.Generated;
{{/useJakartaEe}}

// この行を追加
import lombok.Builder;

{{#models}}
{{#model}}
~~~ 省略 ~~~
<!-- pojo.mustache -->
~~~ 省略 ~~~
{{/vendorExtensions.x-class-extra-annotation}}

// この行を追加
@Builder
public class {{classname}}{{#parent}} ...
~~~ 省略 ~~~

カスタムしたテンプレートを元にコード生成する

コード生成時のオプションに-tを付与して、テンプレートを指定します。

java -jar openapi-generator-cli-6.2.0.jar generate \
   -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml \
   -g spring \
   -o output/spring \
   -t templates/JavaSpring
# -t:テンプレートの指定

ソースコード

終わりに

本業ではSwagger Codegenをカスタマイズしていたのですが、現時点(2022/09/27)の最新版Springには追従してくれていなかったため、OpenAPI Generatorに移行しました。

OpenAPI Generatorが思ったよりもSwagger Codegenと同じような使い方ができたので、良かったです。私の記事では本当に簡単な使い方しか記載していないため、詳細は他の人の記事を見ていただければと思います。

参考情報