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
アノテーションは以下のように書きます。
@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?
)