#contents * 趣旨 [#e2d3c692] openapi-generatorは、javaのmavenプロジェクトなのですが、 どういうわけか、そのままではコンパイルができなかったので、 その時のコンパイルできるようにするまでのコツをメモしておきます。 * 前提条件 [#eec91e01] mavenがインストールされていること java11あたりがインストールされていること、おそらくopenapi-generatorはJava8が想定されている感じがします、理由はビルドの制限がjava11とかになると、ルールが厳しくなってエラー扱いになるのが、ビルドの処理に含まれているからです。 Javaのパスを環境変数のJAVA_HOMEに通しておきましょう。 * コツ [#k5255406] pom.xmlの failOnWarnings をfalseにします。 つぎの指定をいれたほうがいいかもしれません MAVEN_OPTS=--illegal-access=permit ** Openapi-generatorを解析しづらくしている技術 [#cebc400b] ソースコードで標準出力とかにダンプしたりすると、解析が楽になったりするじゃないですか、 ところが、そういうコードがあると、ジェネレータのビルドのチェックに引っかかってコンパイルエラーになるようにしくまれているのです。 誰得?な感じですね。 *** どんなエラーがでるのか? [#x2cf06c1] たったの1行でも、 System.out.println("hoge"); とでも書こうものなら ArchUnitRulesTestに記載されたルールのテストにて、以下のビルドエラーメッセージがでます。 Rule 'no classes should access standard streams' was violated *** 小さな親切大きなお世話なテストライブラリ [#gd7b9950] リリース時にはありがたいのだが、解析するには邪魔なライブラリという感想です。 https://www.freecodecamp.org/news/java-archunit-testing-the-architecture-a09f089585be/ なので、ArchUnitRulesTestのテストはDisabledにしておいたほうがいいかもしれないですね。 * 改造ポイント [#jd1e206b] 改造する箇所は、モデルクラスについてであれば、 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内の変数についても扱う [#ddc6c6d5] model内の変数について扱いたい場合は、上記のCodegenModelの.varsをつかいます。 for (CodegenProperty cp : cm.vars) とします、注意点としては、ジェネリック型の場合は以下のパラメータをみて判定処理を入れるとよいでしょう。 - cp.baseName - cp.complexType とくにcp.complexTypeが指定されていない場合は、Object型として見てあげたほうがいい場合があります。 * openapi-generatorで使うパラメータ [#fdd45535] --model-package これはパッケージ名を指定するパラメータだ --api-package これはコントローラクラス名だったはず --model-name-suffix モデル名の末尾につける名称だ。openapiのモデル名にsuffixがついていると不要だ。openapiのmodelを作る際には、自動生成される場合を想定してモデル名をつけるといいとおもうけど、そこまで器用な人はなかなかいない。 -p これ!、一番わかりづらい。openapi-generatorは、オプションのつけ方が2段構えになっており、ジェネレータ固有のオプションはこんな感じで-pの中にごちゃっと指定する ** -pでごちゃっと指定するパラメータ [#u9acb779] 指定の記法は、 変数名=値,変数名=値,変数名=値,変数名=値,変数名=値 -p 変数名=値,変数名=値,変数名=値,変数名=値,変数名=値 だ。 *** (springジェネレータの場合)おすすめパラメータと設定 [#o748fb8d] dateLibrary=java8-localdatetime hideGenerationTimestamp=true openApiNullable=false prependFormOrBodyParameters=true serializableModel=true serializationLibrary=gson *** (javaジェネレータの場合)おすすめパラメータと設定 [#g9ee64b0] openApiNullable=false serializableModel=true returnSuccessCode=true prependFormOrBodyParameters=true oas3=true hideGenerationTimestamp=true interfaceOnly=true(初回除く)