20190704のKotlinに関する記事は7件です。

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.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が解決できないエラーの場合は末尾に対策を書いてます。

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

表示の改造

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.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!"
    }
}

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

スクリーンショット 2019-07-04 16.36.50.png

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

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

方法1

スクリーンショット 2019-07-04 15.52.33.png

  1. ウィンドウ右側のGradleを押す
  2. スクリーンショット 2019-07-04 15.58.05.pngを押す

image.png

方法2

もしくは、

スクリーンショット 2019-07-04 16.03.21.png

スクリーンショット 2019-07-04 16.03.21.pngをクリックして、設定画面から、
Use auto-import をONにする。
スクリーンショット 2019-07-04 16.05.31.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kotlin + Spring Boot でHello! World!

プロジェクト作成

Spring Initializrでプロジェクトを作成
https://start.spring.io/

以下の図のように選択します。

・Gradle
・Kotlin
・Spring Boot 2.1.6
・Spring Web Starter

スクリーンショット 2019-07-04 13.59.16.png

最後に、「Generate The Project」を押下するとZipファイルがダウンロード開始します。
解凍すると、上記の指定にしたがって作成されたプロジェクトフォルダが現れます。

解凍したフォルダごと、IntellJ IDEAへドロップすると
スクリーンショット 2019-07-04 14.07.26(2).png

IDEが開き、プロジェクト読み込みが開始されます。
Import Gradle projiectと表示されたらクリックします。

スクリーンショット 2019-07-04 14.12.40.png

ポップアップが開くのでOKを押します。
Use auto-import を選択しといた方がいいです。
スクリーンショット 2019-07-04 15.39.17.png

プロジェクト読み込みが完了します。
スクリーンショット 2019-07-04 14.16.49.png

テスト実行

SwaggerDemoApplication.ktを開き、▶︎ボタンを押して表示される「Run」を選択します。
スクリーンショット 2019-07-04 14.27.27.png

この状態で特に何も変化はおきませんが、8080ポートでWebサーバーが起動しています。
http://localhost:8080/

アクセスするとエラーページが表示されてます。

image.png

ログにはアクセスした形跡が表示されてます。
image.png

REST APIの追加

Controllerの作成

com.example.swagger.demoの下にHelloController.ktを作成します。
スクリーンショット 2019-07-04 14.37.08.png
スクリーンショット 2019-07-04 14.40.57.png

以下のようにimportと@GetMappingアノテーションを追加します。
単に文字列を返すだけのgetメソッドです。

HelloController.kt
package 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/hello

Hello! World! が返ってきました。
image.png

RequestParamの追加

このままでは寂しいのでコントローラーにパラメータを渡せるようにしてみます。

RequestMappingとRequestParamを追加します。
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam

HelloControllerに@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! と表示されました。
image.png

パラメータを省略可(required = false,)にしているので、
http://localhost:8080
にアクセスした際にはデフォルト値のWorld(defaultValue = "World")が使用されて、Hello! World!と表示されます。
image.png

参考

Kotlin×Springで作るAPI&ドキュメント - Qiita

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

へっぽこ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 = false

Printlnしてみると、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です。

可読性も上がって良い感じですね。
また、変数のみを出力したい場合は、波括弧{}は省略できるようです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 = false

Printlnしてみると、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です。

可読性も上がって良い感じですね。
また、変数のみを出力したい場合は、波括弧{}は省略できるようです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

へっぽこ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.kt

Hallo World

なにはともあれ、新しい言語を学ぶ時はまずハローワールドから。

以下はJavaのハローワールドです。

HalloWorld.java
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!");
   }
}

続いて、kotlinのハローワールドです。
TryKotlinからコードを拝借しています。

HalloWorld.kt
fun main(args: Array<String>) {
    println("Hello World!")
}

できました。kotlinのほうが、シンプルに書けますね。
パッと見、kotlinで大きく違うのは
①クラス宣言がない
②パラメータの指定方法が違う
③print文がシンプル

といったところでしょうか。細かい部分もありますが、それは今後見ていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.kt

Hallo World

なにはともあれ、新しい言語を学ぶ時はまずハローワールドから。

以下はJavaのハローワールドです。

HalloWorld.java
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!");
   }
}

続いて、kotlinのハローワールドです。
TryKotlinからコードを拝借しています。

HalloWorld.kt
fun main(args: Array<String>) {
    println("Hello World!")
}

できました。kotlinのほうが、シンプルに書けますね。
パッと見、kotlinで大きく違うのは
①クラス宣言がない
②パラメータの指定方法が違う
③print文がシンプル

といったところでしょうか。細かい部分もありますが、それは今後見ていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

へっぽこ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の仕組みに踏み込んでいこうと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む