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] (英語) を使用できます。