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 2.2.x を必要とし、依存関係管理を通じて適切な Kotlin バージョンを管理します。Kotlin を使用するには、org.jetbrains.kotlin:kotlin-stdlib と org.jetbrains.kotlin:kotlin-reflect がクラスパスに存在する必要があります。

Kotlin 2.2.x はパラメーター、フィールド、プロパティにアノテーションを伝播するための新しいデフォルトルール (英語) を導入します。関連する警告を回避し、将来のバージョンで Kotlin のデフォルトの動作となる可能性のあるものを使用するには、-Xannotation-default-target=param-property コンパイラーフラグを設定することをお勧めします。

Kotlin クラスはデフォルトで final (英語) 以降、プロキシできるように Spring アノテーション付きクラスを自動的に開くために、kotlin-spring (英語) プラグインを構成することをお勧めします。

Kotlin で JSON データをシリアライズ / デシリアライズするには、Jackson の Kotlin モジュール [GitHub] (英語) が必要です。クラスパス上で見つかると自動的に登録されます。

これらの依存関係とプラグインは、start.spring.io で Kotlin プロジェクトをブートストラップする場合にデフォルトで提供されます。

null セーフ

Kotlin の重要な機能の 1 つは、null 安全性 (英語) です。問題を実行時に延期して NullPointerException (標準 Javadoc) に遭遇するのではなく、コンパイル時に null 値を処理します。これにより、Optional (標準 Javadoc) などのラッパーのコストを支払うことなく、一般的なバグの原因を排除できます。Kotlin では、この包括的な Kotlin の null 安全性ガイド (英語) に従って、null 許容値を持つ関数構造を使用することもできます。

Java では型システムで null 安全性を表現することはできませんが、ほとんどの Spring プロジェクトは JSpecify (英語) アノテーションを通じて null 安全性を提供します。

Kotlin 2.1 以降、Kotlin は org.jspecify.annotations パッケージからの null 可能性アノテーションの厳密な処理を強制します。

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 (Javadoc) に対して Spring Framework によって提供されるものと同様の TestRestTemplate (Javadoc) 拡張機能が提供されます。特に、拡張機能により、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 (Javadoc) コンストラクターバインディングと組み合わせて使用すると、次の例に示すように、不変の 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 が提供するモデルの制限により、一部の機能 (デフォルト値や非推奨項目の検出など) が機能しないことに注意してください。

テスト

Kotlin コードのテストには JUnit 4 を使用することも可能ですが、JUnit 6 がデフォルトで提供されており、こちらを使用することが推奨されます。JUnit 6 では、テストクラスを一度インスタンス化すれば、そのクラスのすべてのテストで再利用できます。これにより、非静的メソッドに @BeforeAll (英語) および @AfterAll (英語) アノテーションを使用できるようになり、これは Kotlin に最適です。

Kotlin クラスをモックするには、MockK (英語) が推奨されます。Mockito 固有の @MockitoBean と @MockitoSpyBean アノテーションに相当する MockK が必要な場合は、同様の @MockkBean および @SpykBean アノテーションを提供する SpringMockK [GitHub] (英語) を使用できます。