openapi-generatorを用いての自動生成

## 1.目的
　Java Spring BootにてWeb APIを作成する際に、プラグインの「openapi-generatorr」を使用することにより、作成したOpenAPIを元に、Spring BootでRest APIのリクエスト、レスポンスで使用する項目のプロパティを自動生成でき、また、RestAPIのコントローラで使用する呼び出し用のメソッドやレスポンスモデルを自動生成してくれます。
これらについて、記事を残します。


## 2.環境
　　　eclipse（Version: 2022-12 (4.26.0))
　　　java（ver.17) 
　　　spring boot 3.1.1
　　　Gradle - Groovy

## 3.手順
### (1)　資材をコピーする階層を確認する。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/5d5d0f31-abd4-00ea-bea8-8b00ef671fa9.png)

### (2) (1)の階層に、 git(※事前にGitをダウンロードしておく）などを使用して、以下のサイトより資材をコピーする。
<https://github.com/OpenAPITools/openapi-generator>
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/35f0f144-9809-ce6a-ef32-fb6d3d6f38f1.png)

※コピー時は「git clone 【URL】」でダウンロードする。
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/31cbbbdb-677c-c9b4-1678-0062a2598968.png)

### (3) コピーできたことを確認する。（openapi-generator）

　　①【clone中】
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/276ad13f-3a0b-9037-7f3f-1200b67a9d48.png)

　　②【clone後】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/3c7233a6-46fa-8daf-3b07-86b056ba338f.png)


### (4) EclipseでJavaのSpring Boot(Gradle)を作成（事前に作っていても問題なし）
またプロジェクト内にOpenApi用のフォルダに対象のOpenAPIを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/e4bba080-50de-3260-ec65-77cf439ff26d.png)

【対象のOpenAPI】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/0cc597a4-dd20-f87e-2e3e-f3aaaf727b1c.png)


### (5) eclipseのプラグイン用のフォルダへ3.でダウンロードしたフォルダを配置（コピー）する。
　　①（コピー先）【C:\pleiades\2022-12\eclipse\plugins】
　　②（コピー元）（１）の階層
　　③【配置時】
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/4aecdeef-b384-dc2a-f6a9-b60bd0bd8820.png)

### (6) フォルダ名称を「org.openapi.generator」へ変更する（その他のライブラリ名と合わせる）

　　①【コピー後（名称変換前】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/0b961f36-dfa0-c767-9607-2568740d3843.png)

　　②【コピー後（名称変換後】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/35ea1991-6802-534a-e269-99720ab0e1aa.png)

### (7) eclipseで、「openapi-generator」を表示させる。

　　①「build.gradle」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/3f0b1a42-32e3-06f7-37c5-246c33bd3426.png)

　　② 初期の内容に対して「// 追加」のところを変更する。
```java:build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.1'
	id 'io.spring.dependency-management' version '1.1.0'
	id "org.openapi.generator" version "6.2.0"　// 追加
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'　// 追加

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

// 追加　Start
ext {
        // 出力先を設定
        openApiOutputDir = "$rootDir/generated"
}
//　出力したソースをビルドパスに追加
sourceSets.main.java.srcDirs += ["$openApiOutputDir/src/main/java"]
// 追加　End

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
// 追加　Start
	// 依存性を追加
	implementation 'org.openapitools:jackson-databind-nullable:0.2.1'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.9'
	compileOnly 'io.swagger:swagger-annotations:1.6.2'
// 追加　End
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
// 追加　Start
// （openApiの設定を追加）
openApiGenerate {
        generatorName = 'spring'
        inputSpec = "$rootDir/openapi/shukanTalentJohoBFF.yaml".toString() //対象のOpenAPI
        outputDir = "$openApiOutputDir"
        apiPackage = 'com.api'
        modelPackage = 'com.model'
        invokerPackage = "org.openapi.example.invoker"
        configOptions = [
                dateLibrary: 'java8',
                interfaceOnly: 'true',
                skipDefaultInterface: 'true'
        ]
}
// 追加　End
tasks.named('test') {
	useJUnitPlatform()
}
```

　　③ 出力先と取込元の設定を行う
　　　出力先：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/0ab59b32-e31a-0759-d11f-4fff97e2876b.png)

※ 「$rootDir/」は固定で、後ろに作成結果を格納したディレクトリ名を指定する。

　　　取込元：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/84199a79-5230-8384-cb5d-33a6d86c02f2.png)

※ 「$rootDir/」は固定で、後ろにシート「事前準備系」②で用意したフォルダ名と今回対象とするOpenAPIのyamlの名称を指定する。

　　④ 再度、eclipseを開きなおし、Gradleタスクの表示の確認をする。
　　⑤ 一覧の「openapi tools」が表示されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/3aeb8b47-0157-4c16-3bf8-1465e692233d.png)



### (8) openApiGenerateの実行
　　① 一覧の「openapi tools」内に、「openApiGenerate」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/779f6315-3ae9-a4f7-5079-c0d970b771c1.png)

　　② コンソールに以下のように表示されれれば、実行は成功（エラーの場合、赤文字のトレース分が表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/4a139149-f5a2-b5e8-f513-2040dc0e232a.png)

　　③ 出力先に以下のように資材が出力されていた場合、問題なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/4d941ad9-0c67-1265-bff4-3d48bbe677ce.png)

### (9) 出力先の確認
　以下の階層でできていることを確認

　　①【ApiUtil.java】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/be539e20-d75f-d28f-4b05-037f176cb534.png)

　　②【ShukanTalentJohoBFFApi.java】（Controllerにおいてのメソッドの定義）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/973187b0-e7f3-f165-e94d-71a51531cd65.png)

　　③【ShukanTalentJohoBFF.java】（Responseのモデル定義）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/dcc79723-2974-2edb-2128-47c3f8f2857c.png)


## 4.終わりに
この後、Controllerを作る際に、「ShukanTalentJohoBFFApi.java」のメソッドを継承し、
作成することができます。またその中で、「ShukanTalentJohoBFF.java」を参照することでモデルを利用できます。
次回は、「SQLGenerator」について記事を残します。