Kotlin で Spring アプリケーションを書く

Jul 27, 2018 ( Feb 11, 2022 更新 )

Kotlin で Spring Boot のプロジェクトを作ってみたので、 便利な書き方や詰まったところなどを書いておきます。

Spring Initializr

Kotlin で1からプロジェクトを作る場合は、 Spring Initializr で Kotlin を選んで雛形をダウンロードすると楽です。

@Entity のデフォルトコンストラクタ対応

以下のような @Entity クラスで val 指定の primary constructor を使いたい場合、そのまま書いてしまうと引数なしのデフォルトコンストラクタがないため DB からのデータ取得に失敗します(No default constructor for entity エラー)。

@Entity
@Table(name = "tasks")
class Task(val name: String) {
  // 略
}

https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell

上記の記事にあるように、 kotlin-noarg というプラグインを使うことによって 引数なしのデフォルトコンストラクタを特定のアノテーションが付与されているクラスに 対して有効にすることができます。

上記の @Entity のアノテーションに対応するには以下のように kotlin-jpa プラグインを組み合わせて使います。

buildscript {
	// 略
	dependencies {
		// 略
		classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}")
	}
}

apply plugin: 'kotlin-jpa'

@Autowired の書き方

Kotlin ではクラスのプロパティの初期化処理を書かなければいけませんが、 そのままだと @Autowired を使った DI に対応できません。

null にはならないけど、コンストラクタの初期化の後で初期化されるプロパティには、 lateinit を使うことができます。 また、 lateinit プロパティが初期化されていないタイミングでアクセスすると例外が送出されるとのことです。

Spring の @Autowired アノテーションは以下のように書きます。

https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0#leveraging-kotlin-nullable-information-in-spring-annotations

    @Autowired
    lateinit var taskService: TaskService

Form Class とバリデーション

リクエストパラメータを受け取る Form Class には data class を使いました。 この場合の @NotNull などのバリデーションに使うアノテーションの付け方ですが、以下のように field: を使うとフィールドにアノテーションを付けることができます。

Annotations - Kotlin Programming Language

data class TaskCreateRequest(
        @field:NotNull
        @field:Size(min=1, max = 255)
        val name: String,

        val isDone: Boolean?,

        @field:Size(min=1, max = 255)
        val description: String?,

        val priority: Priority?,

        val deadline: Date?
)
Return to top