Kotlin サポート
Kotlin (英語) は、JVM(および他のプラットフォーム)を対象とする静的に型付けされた言語で、Java で記述された既存のライブラリとの相互運用性 (英語) を提供しながら、簡潔でエレガントなコードを記述できます。
Spring Boot は、Spring Framework、Spring Data、Reactor などの他の Spring プロジェクトのサポートを活用することにより、Kotlin サポートを提供します。詳細については、Spring Framework Kotlin サポートドキュメントを参照してください。
Spring Boot および Kotlin を開始する最も簡単な方法は、この包括的なチュートリアルに従うことです。start.spring.io を使用して、新しい Kotlin プロジェクトを作成できます。サポートが必要な場合は、Kotlin Slack (英語) の #spring チャネルに参加するか、Stack Overflow (英語) の spring
タグと kotlin
タグを使用して質問してください。
要件
Spring Boot には少なくとも Kotlin 1.7.x が必要であり、依存関係管理を通じて適切な Kotlin バージョンを管理します。Kotlin を使用するには、org.jetbrains.kotlin:kotlin-stdlib
と org.jetbrains.kotlin:kotlin-reflect
がクラスパスに存在している必要があります。kotlin-stdlib
バリアント kotlin-stdlib-jdk7
および kotlin-stdlib-jdk8
も使用できます。
Kotlin クラスはデフォルトで final (英語) 以降、プロキシできるように Spring アノテーション付きクラスを自動的に開くために、kotlin-spring (英語) プラグインを構成することをお勧めします。
Jackson の Kotlin モジュール [GitHub] (英語) は、Kotlin で JSON データをシリアライズ / デシリアライズするために必要です。クラスパスで見つかると自動的に登録されます。Jackson および Kotlin が存在するが、Jackson Kotlin モジュールが存在しない場合、警告メッセージがログに記録されます。
これらの依存関係とプラグインは、start.spring.io で Kotlin プロジェクトをブートストラップする場合にデフォルトで提供されます。 |
null セーフ
Kotlin の主要な機能の 1 つは、null-safety (英語) です。問題を実行時まで延期して NullPointerException
を検出するのではなく、コンパイル時に null
値を処理します。これは、Optional
のようなラッパーのコストを支払うことなく、バグの一般的な原因を排除できます。また、Kotlin では、Kotlin の null の安全性に関するこの包括的なガイド (英語) で説明されているように、null 可能な値を持つ関数構造を使用できます。
Java では、型システムで null の安全性を表現することはできませんが、Spring Framework、Spring Data、および Reactor は、ツールに適したアノテーションを通じて API の null の安全性を提供するようになりました。デフォルトでは、Kotlin で使用される Java API の型は、null チェックが緩和されたプラットフォーム型として認識 (英語) されます。 nullability アノテーションと組み合わせた Kotlin による JSR 305 アノテーションのサポート (英語) は、Kotlin の関連する Spring API に null の安全性を提供します。
JSR 305 チェックは、-Xjsr305
コンパイラーフラグに次のオプションを追加することで構成できます。-Xjsr305={strict|warn|ignore}
デフォルトの動作は -Xjsr305=warn
と同じです。strict
値は、Spring API から推測された Kotlin 型で null の安全性を考慮に入れる必要がありますが、Spring API の null 可能性宣言はマイナーリリース間でも発展する可能性があり、今後さらにチェックが追加される可能性があるという知識とともに使用する必要があります)。
ジェネリクス型の引数、可変引数、配列要素の nullability はまだサポートされていません。最新情報については、SPR-15942 (英語) を参照してください。また、Spring Boot の独自の API にはまだアノテーションが付けられていない [GitHub] (英語) ことに注意してください。 |
Kotlin API
runApplication
Spring Boot は、次の例に示すように、runApplication<MyApplication>(*args)
でアプリケーションを実行する慣用的な方法を提供します。
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
これは SpringApplication.run(MyApplication::class.java, *args)
のドロップイン置換です。また、次の例に示すように、アプリケーションをカスタマイズできます。
runApplication<MyApplication>(*args) {
setBannerMode(OFF)
}
拡張
Kotlin 拡張機能 (英語) は、追加機能を使用して既存のクラスを継承する機能を提供します。Spring Boot Kotlin API は、これらの拡張機能を利用して、既存の API に新しい Kotlin 固有の便利な機能を追加します。
Spring Framework の RestOperations
に対して Spring Framework によって提供されるものと同様の TestRestTemplate
拡張機能が提供されます。特に、拡張機能により、Kotlin の型指定されたパラメーターを利用できるようになります。
依存関係管理
異なるバージョンの Kotlin 依存関係のクラスパスへの混在を避けるために、Spring Boot は Kotlin BOM をインポートします。
Maven では、kotlin.version
プロパティを設定することで Kotlin バージョンをカスタマイズでき、kotlin-maven-plugin
のプラグイン管理が提供されます。Gradle を使用すると、Spring Boot プラグインは kotlin.version
を Kotlin プラグインのバージョンに自動的に位置合わせします。
Spring Boot は、Kotlin コルーチン BOM をインポートすることにより、コルーチンの依存関係のバージョンも管理します。バージョンは、kotlin-coroutines.version
プロパティを設定することでカスタマイズできます。
start.spring.io に少なくとも 1 つのリアクティブ依存関係がある Kotlin プロジェクトをブートストラップする場合、org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依存関係がデフォルトで提供されます。 |
@ConfigurationProperties
@ConfigurationProperties
は、コンストラクターバインディングと組み合わせて使用すると、次の例に示すように、不変の val
プロパティを持つデータクラスをサポートします。
@ConfigurationProperties("example.kotlin")
data class KotlinExampleProperties(
val name: String,
val description: String,
val myService: MyService) {
data class MyService(
val apiToken: String,
val uri: URI
)
}
Java との相互運用性の制限により、値クラスのサポートは制限されています。特に、値クラスのデフォルト値に依存すると、構成プロパティのバインディングでは機能しません。このような場合は、代わりにデータクラスを使用する必要があります。
アノテーションプロセッサーを使用して独自のメタデータを生成するには、kapt を spring-boot-configuration-processor 依存関係で構成する必要があります (英語) 。kapt が提供するモデルの制限により、一部の機能 (デフォルト値や非推奨項目の検出など) が機能しないことに注意してください。 |
テスト
JUnit 4 を使用して Kotlin コードをテストすることは可能ですが、JUnit 5 はデフォルトで提供されており、推奨されています。JUnit 5 では、テストクラスを 1 回インスタンス化し、クラスのすべてのテストに再利用できます。これにより、非静的メソッドで @BeforeAll
および @AfterAll
アノテーションを使用できるようになり、Kotlin に適しています。
Kotlin クラスをモックするには、MockK (英語) をお勧めします。Mockito 固有の @MockBean
および @SpyBean
アノテーションに相当する MockK
が必要な場合は、同様の @MockkBean
および @SpykBean
アノテーションを提供する SpringMockK [GitHub] (英語) を使用できます。
リソース
参考文献
Kotlin Slack (英語) (専用の #spring チャンネル)
サンプル
spring-boot-kotlin-demo [GitHub] (英語) : 通常の Spring Boot + Spring Data JPA プロジェクト
mixit [GitHub] (英語) : Spring Boot 2 + WebFlux + リアクティブ Spring Data MongoDB
spring-kotlin-fullstack [GitHub] (英語) : JavaScript または TypeScript の代わりにフロントエンドに Kotlin2js を使用した WebFlux Kotlin フルスタックの例
spring-petclinic-kotlin [GitHub] (英語) : Spring PetClinic サンプルアプリケーションの Kotlin バージョン
spring-kotlin-deepdive [GitHub] (英語) : Boot 1.0 + Java から Boot 2.0 + Kotlin への段階的な移行
spring-boot-coroutines-demo [GitHub] (英語) : コルーチンサンプルプロジェクト