- 投稿日:2019-07-04T16:36:06+09:00
Kotlin + Spring Boot + Swagger
Kotlin + Spring Boot + Swagger
Swagger
前回、Kotlin + Spring Boot でHello! World!
で作成したプロジェクトにSwaggerを追加します。springfoxの追加
build.gradle.ktsの
dependenciesに以下を追加します。compile ("io.springfox:springfox-swagger2:2.9.2") compile ("io.springfox:springfox-swagger-ui:2.9.2")dependenciesは以下のようになります。
build.gradle.ktsdependencies { 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が解決できないエラーの場合は末尾に対策を書いてます。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.htmlSwaggerが表示されたら成功です。
表示の改造
SwaggerDemoApplication.kt
importを追加
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を以下に変更する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アノテーションを追加@ApiOperation(value = "Hello Endpoint", notes = "Hello, name!") // ドキュメントに説明文以下になる
HelloController.ktpackage 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!" } }説明文が追加され、すっきりした表示になりました。
springfoxが解決できないエラーの場合
springfoxが解決できないと表示されたら
方法1
方法2
もしくは、
- 投稿日:2019-07-04T15:07:42+09:00
Kotlin + Spring Boot でHello! World!
プロジェクト作成
Spring Initializrでプロジェクトを作成
https://start.spring.io/以下の図のように選択します。
・Gradle
・Kotlin
・Spring Boot 2.1.6
・Spring Web Starter最後に、「Generate The Project」を押下するとZipファイルがダウンロード開始します。
解凍すると、上記の指定にしたがって作成されたプロジェクトフォルダが現れます。解凍したフォルダごと、IntellJ IDEAへドロップすると
IDEが開き、プロジェクト読み込みが開始されます。
Import Gradle projiectと表示されたらクリックします。ポップアップが開くのでOKを押します。
Use auto-import を選択しといた方がいいです。
テスト実行
SwaggerDemoApplication.ktを開き、▶︎ボタンを押して表示される「Run」を選択します。
この状態で特に何も変化はおきませんが、8080ポートでWebサーバーが起動しています。
http://localhost:8080/アクセスするとエラーページが表示されてます。
REST APIの追加
Controllerの作成
com.example.swagger.demoの下にHelloController.ktを作成します。
以下のようにimportと
@GetMappingアノテーションを追加します。
単に文字列を返すだけのgetメソッドです。HelloController.ktpackage com.example.swagger.demo import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @RestController class HelloController { @GetMapping("/hello") fun hello(): String { return "Hello! World!" } }再度実行して以下のアドレスにアクセスします。
http://localhost:8080/helloRequestParamの追加
このままでは寂しいのでコントローラーにパラメータを渡せるようにしてみます。
RequestMappingとRequestParamを追加します。
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParamHelloControllerに
@RequestMappingアノテーションを追加し以下のようにします。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 @RestController @RequestMapping class HelloController { @GetMapping("/hello") fun hello(@RequestParam(value = "name", required = false, defaultValue = "world") name: String): String { return "Hello, $name!" } }再度実行して以下のアドレスにアクセスします。
http://localhost:8080/hello?name=taroリクエストパラメータ ”name" にtaro が渡されて、Hello! taro! と表示されました。
パラメータを省略可(required = false,)にしているので、
http://localhost:8080
にアクセスした際にはデフォルト値のWorld(defaultValue = "World")が使用されて、Hello! World!と表示されます。
参考
- 投稿日:2019-07-04T13:41:21+09:00
へっぽこJavaプログラマがkotlinに挑戦する #2 基礎編①
変数(val)
Javaの変数といえば
String name = "abe"; int i = 0; Boolean ret = false;こんな感じですが、これをkotlinで書くとこうなります。
val name : String = "abe" val i : Int = 0 val ret : Boolean = falsePrintlnしてみると、Javaとkotlinで同じ結果が出ることが確認できます。
abe 0 falseなんだかkotlinの方が助長な書き方で面倒だな、と思ったのですが、
kotlinには型推論の機能が備わっているため、以下のように短く記述可能なようです。val name = "abe" val i = 0 val ret = false結果は同じになります。
これなら、Javaから型の指定を無くしたようなシンプルな書き方で良いですね。
勿論、明示的に型を書くことも可能なので、使い分けになるのでしょうか。文字ではchar型が、数値では基本型が、など型には色々ありますが、
業務で使うのは今までの経験上、Int,Doubleくらいだったので、
他はまぁ流し見で良いかな、くらいの感覚です。(使う時に、あらためて確認)変数(var)
ここまで変数を「val」で定義してきましたが、
実はこいつ、途中で書き換えられません。
上記変数nameを途中で「tanaka」にしようとしても、コンパイルが通りません。途中で書き換えたい場合は「var」を使います。
var name = "abe" name = "tanaka" println(name)tanakaどっちがどっちか覚えづらいなーと思ったのですが、公式によると
valは「value(値)」
varは「variable(変数)」
で、割とそのまんまの意味の略語のようです。「;」がいらない
ここまで書いてきて、非常に楽だったのが、
kotlinにおいては、Javaでは変数宣言などで文末に必ず必要だった「;」が不要になっています。JVM系言語の中でもよりJavaをスマートに書けるようにしているkotlinには、
このようなJavaのめんどくさいところを楽にしてくれる箇所が色々あるようです。
print文でSystem.outのようなライブラリ・クラス指定がいらないのもその1つですね。文字連結
JavaでString型の文字を連結する時は、以下のような感じでやっていました。
(性能面への影響次第で使い分け)int avg = 300; int hr = 30; // +で結合 System.out.println("今日時点での成績は打率." + avg + "、本塁打" + hr + "です。"); // StringBuilderで結合 StringBuilder sb = new StringBuilder(); sb.append("今日時点での成績は打率."); sb.append(avg); sb.append("、本塁打"); sb.append(hr); sb.append("です。"); System.out.println(sb.toString());今日時点での成績は打率.300、本塁打30です。 今日時点での成績は打率.300、本塁打30です。これをkotlinでは、JDBCのSQLのバインド変数のように、埋め込み文字列にできます。
val avg = 300 val hr = 30 println("今日時点での成績は打率.${avg}、本塁打${hr}です。")今日時点での成績は打率.300、本塁打30です。可読性も上がって良い感じですね。
また、変数のみを出力したい場合は、波括弧{}は省略できるようです。
- 投稿日:2019-07-04T13:41:21+09:00
Javaプログラマがkotlinに挑戦する #2 基礎編①
変数(val)
Javaの変数といえば
String name = "abe"; int i = 0; Boolean ret = false;こんな感じですが、これをkotlinで書くとこうなります。
val name : String = "abe" val i : Int = 0 val ret : Boolean = falsePrintlnしてみると、Javaとkotlinで同じ結果が出ることが確認できます。
abe 0 falseなんだかkotlinの方が助長な書き方で面倒だな、と思ったのですが、
kotlinには型推論の機能が備わっているため、以下のように短く記述可能なようです。val name = "abe" val i = 0 val ret = false結果は同じになります。
これなら、Javaから型の指定を無くしたようなシンプルな書き方で良いですね。
勿論、明示的に型を書くことも可能なので、使い分けになるのでしょうか。文字ではchar型が、数値では基本型が、など型には色々ありますが、
業務で使うのは今までの経験上、Int,Doubleくらいだったので、
他はまぁ流し見で良いかな、くらいの感覚です。(使う時に、あらためて確認)変数(var)
ここまで変数を「val」で定義してきましたが、
実はこいつ、途中で書き換えられません。
上記変数nameを途中で「tanaka」にしようとしても、コンパイルが通りません。途中で書き換えたい場合は「var」を使います。
var name = "abe" name = "tanaka" println(name)tanakaどっちがどっちか覚えづらいなーと思ったのですが、公式によると
valは「value(値)」
varは「variable(変数)」
で、割とそのまんまの意味の略語のようです。「;」がいらない
ここまで書いてきて、非常に楽だったのが、
kotlinにおいては、Javaでは変数宣言などで文末に必ず必要だった「;」が不要になっています。JVM系言語の中でもよりJavaをスマートに書けるようにしているkotlinには、
このようなJavaのめんどくさいところを楽にしてくれる箇所が色々あるようです。
print文でSystem.outのようなライブラリ・クラス指定がいらないのもその1つですね。文字連結
JavaでString型の文字を連結する時は、以下のような感じでやっていました。
(性能面への影響次第で使い分け)int avg = 300; int hr = 30; // +で結合 System.out.println("今日時点での成績は打率." + avg + "、本塁打" + hr + "です。"); // StringBuilderで結合 StringBuilder sb = new StringBuilder(); sb.append("今日時点での成績は打率."); sb.append(avg); sb.append("、本塁打"); sb.append(hr); sb.append("です。"); System.out.println(sb.toString());今日時点での成績は打率.300、本塁打30です。 今日時点での成績は打率.300、本塁打30です。これをkotlinでは、JDBCのSQLのバインド変数のように、埋め込み文字列にできます。
val avg = 300 val hr = 30 println("今日時点での成績は打率.${avg}、本塁打${hr}です。")今日時点での成績は打率.300、本塁打30です。可読性も上がって良い感じですね。
また、変数のみを出力したい場合は、波括弧{}は省略できるようです。
- 投稿日:2019-07-04T12:07:44+09:00
へっぽこJavaプログラマがkotlinに挑戦する #1 HalloWorld編
開発環境
今回は、JetBrains社のIntelliJを使っていきます。
AndroidStudioという手もあったのですが、
サーバサイドkotlinを志すなら、IntelliJのほうが将来的にも良いかな、と。
eclipseにもプラグインが用意されており、使えるようです。ちょっと動かしたい、という方は公式サイトの「Try Kotlin」がおすすめです。
Webページ上で、IDEを使っているような感覚でコードが試せます。
https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.ktHallo World
なにはともあれ、新しい言語を学ぶ時はまずハローワールドから。
以下はJavaのハローワールドです。
HalloWorld.javapublic class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } }続いて、kotlinのハローワールドです。
TryKotlinからコードを拝借しています。HalloWorld.ktfun main(args: Array<String>) { println("Hello World!") }できました。kotlinのほうが、シンプルに書けますね。
パッと見、kotlinで大きく違うのは
①クラス宣言がない
②パラメータの指定方法が違う
③print文がシンプルといったところでしょうか。細かい部分もありますが、それは今後見ていこうと思います。
- 投稿日:2019-07-04T12:07:44+09:00
Javaプログラマがkotlinに挑戦する #1 HalloWorld編
開発環境
今回は、JetBrains社のIntelliJを使っていきます。
AndroidStudioという手もあったのですが、
サーバサイドkotlinを志すなら、IntelliJのほうが将来的にも良いかな、と。
eclipseにもプラグインが用意されており、使えるようです。ちょっと動かしたい、という方は公式サイトの「Try Kotlin」がおすすめです。
Webページ上で、IDEを使っているような感覚でコードが試せます。
https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.ktHallo World
なにはともあれ、新しい言語を学ぶ時はまずハローワールドから。
以下はJavaのハローワールドです。
HalloWorld.javapublic class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } }続いて、kotlinのハローワールドです。
TryKotlinからコードを拝借しています。HalloWorld.ktfun main(args: Array<String>) { println("Hello World!") }できました。kotlinのほうが、シンプルに書けますね。
パッと見、kotlinで大きく違うのは
①クラス宣言がない
②パラメータの指定方法が違う
③print文がシンプルといったところでしょうか。細かい部分もありますが、それは今後見ていこうと思います。
- 投稿日:2019-07-04T11:38:19+09:00
へっぽこJavaプログラマがkotlinに挑戦する #0 導入編
はじめに
私はSIerで8年ほど、Javaプログラマとして仕事をしてきました。
狭い視野でものを見ていたので、同期や協力会社の同年代の方々よりは、
プログラミングスキルはある方かな、と思っていたのですが、
ここ最近、新しい技術に目を向け、多くのエンジニアの方々を目にし、
自分の実力のなさを痛感した次第です。そんな私が、近いうちにkotlinの案件に携われるチャンスが巡ってきました。
量産型SIerプログラマから脱却すべく、見る専だったQiitaを初めて書きながら、
勉強していきたいと思います。同じような境遇の方もたくさんいらっしゃると思うので、何かの参考になると幸いです。
また、素人が書くkotlinの記事であり、
ツッコミどころも多々あると思いますので、指摘等あれば大歓迎です。環境
OS:MacOS
IDE:IntelliJ開発歴
Java 8年強(主に〜1.8)
フレームワーク Apache Struts2、Spring Framework
IDE Eclipse(Eclipse以外は1度もなし!)
DB Oracle、PostgreSQL設計をやることも多く、がっつり開発をやれていた、というほどではないです。
お堅いプロジェクトが多く、技術的にはかなりレガシーです。
(1.8だけどStreamやラムダ式を使いたがらない、
ジェネリクスや拡張for文くらいまでなら・・・といった雰囲気)kotlinって何?
IntelliJを提供しているJetBrains(ジェットブレインズ)社が開発したJVM系言語です。
詳しくはWikipediaあたりを見た方が無難かなと思います。
特筆すべきは100%を自負するJavaとの互換性にあり、
私のようなJavaプログラマが多くの学習コストをかけずに習得できる、とあります。
ホントかよ?と思いますが・・・Androidアプリ開発の正式言語として採用されてから、一気に知名度を上げたようです。
また、最近はサーバサイドでの活用も注目されており、
私が今後やっていきたいのが、このサーバサイドkotlinになります。日本語の参考書も充実しており、私も何冊か購入しています。(いずれ、紹介します)
最後に
余談ですが、kotlinを選択した理由のひとつが、名前がかわいい(笑)
次回から、具体的にkotlinの仕組みに踏み込んでいこうと思います!


















