Kotlin + Spring Boot + Swagger

Kotlin + Spring Boot + Swagger

# Swagger

前回、[Kotlin \+ Spring Boot でHello\! World\!](https://qiita.com/sugasaki/items/d42d017961a97f5363ee)
で作成したプロジェクトにSwaggerを追加します。

## springfoxの追加


build.gradle.ktsの`dependencies`に以下を追加します。

```kotlin
compile ("io.springfox:springfox-swagger2:2.9.2")
compile ("io.springfox:springfox-swagger-ui:2.9.2")
```

dependenciesは以下のようになります。

```kotlin:build.gradle.kts
dependencies {
	compile ("io.springfox:springfox-swagger2:2.9.2")
	compile ("io.springfox:springfox-swagger-ui:2.9.2")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```


## EnableSwagger2の追加

SwaggerDemoApplication.kt にEnableSwagger2のimportと`@EnableSwagger2`アノテーションを追加します。

以下のようになります。
※もしここでspringfoxが解決できないエラーの場合は末尾に対策を書いてます。

```kotlin
package com.example.swagger.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import springfox.documentation.swagger2.annotations.EnableSwagger2


@SpringBootApplication
@EnableSwagger2
class SwaggerDemoApplication

fun main(args: Array<String>) {
	runApplication<SwaggerDemoApplication>(*args)
}
```




以下にアクセスします。
http://localhost:8080/swagger-ui.html

Swaggerが表示されたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/a28e07af-11b8-a6ba-a491-a79daea89ab4.png)



## 表示の改造

### SwaggerDemoApplication.kt

importを追加

```kotlin
import org.springframework.context.annotation.Bean
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.service.ApiInfo
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
```


`class SwaggerDemoApplication` を以下に変更する

```kotlin
class SwaggerDemoApplication
{
	@Bean
	fun swaggerDemoApi(): Docket {
		return Docket(DocumentationType.SWAGGER_2)
				.useDefaultResponseMessages(false) // defaultのResponse Code/Messageを表示しない
				.select()
				.paths(PathSelectors.regex("/hello*")) // /hello配下を明示的に選択する
				.build()
				.apiInfo(apiInfo())
	}

	fun apiInfo(): ApiInfo {
		return ApiInfoBuilder()
				.title("API Document Demo")
				.description("This is an API document powered by swagger.")
				.version("0.0.0")
				.build()
	}
}
```


### HelloController

`import io.swagger.annotations.ApiOperation`を追加
`@ApiOperation`アノテーションを追加

```kotlin
@ApiOperation(value = "Hello Endpoint", notes = "Hello, name!") // ドキュメントに説明文
```


以下になる

```kotlin:HelloController.kt
package com.example.swagger.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import io.swagger.annotations.ApiOperation

@RestController
@RequestMapping
class HelloController {
    @GetMapping("/hello")
    @ApiOperation(value = "Hello Endpoint", notes = "Hello, name!") // Swaggerに説明文
    fun hello(@RequestParam(value = "name", required = false, defaultValue = "World") name: String): String {
        return "Hello! $name!"
    }
}
```

説明文が追加され、すっきりした表示になりました。

<img width="620" alt="スクリーンショット 2019-07-04 16.36.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/b71e4324-62a2-a93d-cefb-40323f13bcd7.png">


# springfoxが解決できないエラーの場合

springfoxが解決できないと表示されたら

## 方法１

<img width="279" alt="スクリーンショット 2019-07-04 15.52.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/7f399db3-bc94-8574-0c63-f1f42ff9ab8b.png">


1. ウィンドウ右側のGradleを押す
2. <img width="14" alt="スクリーンショット 2019-07-04 15.58.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/36da6718-d453-7bec-ac47-742250a8007e.png">を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/38eb164d-fd37-0b46-413b-475702334f43.png)


## 方法２

もしくは、

<img width="282" alt="スクリーンショット 2019-07-04 16.03.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/2d29ae45-4174-c485-6901-8b83af95d8db.png">


<img width="17" alt="スクリーンショット 2019-07-04 16.03.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/d59e6237-7775-f2bb-abb3-c21a95288c9e.png">をクリックして、設定画面から、
Use auto-import をONにする。
<img width="613" alt="スクリーンショット 2019-07-04 16.05.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/187c065c-2393-d90d-ce69-2d59d73b3b28.png">