趣旨

openapi-generatorは、javaのmavenプロジェクトなのですが、

どういうわけか、そのままではコンパイルができなかったので、

その時のコンパイルできるようにするまでのコツをメモしておきます。

前提条件

mavenがインストールされていること

java11あたりがインストールされていること、おそらくopenapi-generatorはJava8が想定されている感じがします、理由はビルドの制限がjava11とかになると、ルールが厳しくなってエラー扱いになるのが、ビルドの処理に含まれているからです。

Javaのパスを環境変数のJAVA_HOMEに通しておきましょう。

コツ

pom.xmlの

failOnWarnings

をfalseにします。

つぎの指定をいれたほうがいいかもしれません

MAVEN_OPTS=--illegal-access=permit

Openapi-generatorを解析しづらくしている技術

ソースコードで標準出力とかにダンプしたりすると、解析が楽になったりするじゃないですか、

ところが、そういうコードがあると、ジェネレータのビルドのチェックに引っかかってコンパイルエラーになるようにしくまれているのです。

誰得?な感じですね。

どんなエラーがでるのか?

たったの1行でも、

System.out.println("hoge");

とでも書こうものなら

ArchUnitRulesTest?に記載されたルールのテストにて、以下のビルドエラーメッセージがでます。

Rule 'no classes should access standard streams' was violated

小さな親切大きなお世話なテストライブラリ

リリース時にはありがたいのだが、解析するには邪魔なライブラリという感想です。

https://www.freecodecamp.org/news/java-archunit-testing-the-architecture-a09f089585be/

なので、ArchUnitRulesTest?のテストはDisabledにしておいたほうがいいかもしれないですね。

改造ポイント

改造する箇所は、モデルクラスについてであれば、

postProcessAllModels(Map<String, Object> objs)

です。

objsにはyaml定義直下の要素の配列が格納されているので、以下のfor文で要素を変数に入れてあげます。

for (Map.Entry<String, Object> entry: objs.entrySet()

さらに、ここにはmodelが複数格納されているので、以下のようにして、modelを1つづつ取り扱えるようにします。

Map<String, Object> inner = (Map<String, Object>) entry.getValue();
List<Map<String, Object>> models = (List<Map<String, Object<<) inner.get("models");
for(Map<String, Object> mo: models)

これを1つのモデルごとの処理単位だったら、もう少し扱いやすくなるので、ここで次のメソッドを入れてあげましょう。

ここまで、汎用的なMapでしたが、ここまでくると、次のようにしてCodeGenerator?独自のクラスのインスタンスとして取得できます。

CodegenModel cm = (CodegenModel) mo.get("model");

上記の変数moは、Mapでして、ここに独自の変数をkey,Valueで登録することによって、テンプレートのmustacheで変数名として値を取得したり、boolean型であれば、テンプレートの制御ができるよになるのです。

ちなみにboolean型ではダメで、Boolean型で登録する必要があります。

model内の変数についても扱う

model内の変数について扱いたい場合は、上記のCodegenModel?の.varsをつかいます。

for (CodegenProperty cp : cm.vars)

とします、注意点としては、ジェネリック型の場合は以下のパラメータをみて判定処理を入れるとよいでしょう。

とくにcp.complexTypeが指定されていない場合は、Object型として見てあげたほうがいい場合があります。

openapi-generatorで使うパラメータ

--model-package

これはパッケージ名を指定するパラメータだ

--api-package

これはコントローラクラス名だったはず

--model-name-suffix

モデル名の末尾につける名称だ。openapiのモデル名にsuffixがついていると不要だ。openapiのmodelを作る際には、自動生成される場合を想定してモデル名をつけるといいとおもうけど、そこまで器用な人はなかなかいない。

-p 

これ!、一番わかりづらい。openapi-generatorは、オプションのつけ方が2段構えになっており、ジェネレータ固有のオプションはこんな感じで-pの中にごちゃっと指定する

-pでごちゃっと指定するパラメータ

指定の記法は、

-p 変数名=値,変数名=値,変数名=値,変数名=値,変数名=値

だ。

(springジェネレータの場合)おすすめパラメータと設定

dateLibrary=java8-localdatetime
hideGenerationTimestamp=true
openApiNullable=false
prependFormOrBodyParameters=true
serializableModel=true
serializationLibrary=gson

(javaジェネレータの場合)おすすめパラメータと設定

openApiNullable=false
serializableModel=true
returnSuccessCode=true
prependFormOrBodyParameters=true
oas3=true
hideGenerationTimestamp=true
interfaceOnly=true(初回除く)
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-06-24 (金) 22:48:57 (49d)