このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Boot 3.5.7 を使用してください!

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 (英語) プラグインを構成することをお勧めします。

Jackson の Kotlin モジュール [GitHub] (英語) は、Kotlin で JSON データをシリアライズ / デシリアライズするために必要です。クラスパスで見つかると自動的に登録されます。Jackson および Kotlin が存在するが、Jackson Kotlin モジュールが存在しない場合、警告メッセージがログに記録されます。

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

null セーフ

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

Although Java does not let you express null-safety in its type-system, most Spring projects provide null-safety via JSpecify (英語) annotations.

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