はじめに
ToDoリスト用の簡単なAPIを作成する際にToDoのタイトルのバリデーションチェックをしようとしました。タイトルが未入力の場合500エラーを返そうとして、@Validated
というものを利用したのですが、なぜかうまく動かずかなり苦戦したのでまとめます
問題
以下のAPIを作成しました
ToDoController.kt
package com.example.todolist
import com.example.todolist.application.service.ToDoService
import com.example.todolist.domain.model.ToDo
import com.example.todolist.presentation.form.GetTodoListResponse
import com.example.todolist.presentation.form.RegisterToDoRequest
import com.example.todolist.presentation.form.ToDoInfo
import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
import org.springframework.validation.BindingResult
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*
import javax.management.BadAttributeValueExpException
private val logger = LoggerFactory.getLogger(ToDoController::class.java)
@RestController
class ToDoController(
private val toDoService: ToDoService
) {
@PostMapping("/todo")
@ResponseStatus(HttpStatus.OK)
fun createToDo(@RequestBody @Validated request: RegisterToDoRequest, bindingResult: BindingResult) {
if (bindingResult.hasErrors()) {
throw BadAttributeValueExpException("タイトルを入力してください")
}
toDoService.register(
ToDo(
0,
request.title,
false,
)
)
}
}
ToDoForm.kt
import javax.validation.constraints.NotBlank
data class RegisterToDoRequest(
@field:NotBlank
val title: String,
)
build.gradle.kt
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("javax.validation:validation-api:2.0.1.Final")
javax.validation
はいろいろ記事を探していて、このアノテーションを利用すると書いてあるものが多かったので入れています
しかし、このAPIを叩いても何故かバリデーションチェックは行われずbindingResult
のエラーは0
となってしまいました
解決方法
@NotBlank
をjavax.validation.constraints.NotBlank
から利用していましたが、org.hibernate.validator.constraints.NotBlank
を利用することでバリデーションが動くようになりました
ToDoForm.kt
package com.example.todolist.presentation.form
import com.example.todolist.domain.model.ToDo
import org.hibernate.validator.constraints.NotBlank
data class RegisterToDoRequest(
@field:NotBlank
val title: String,
)
依存関係に追加していた
build.gradle.kt
implementation("javax.validation:validation-api:2.0.1.Final")
は削除しました
おわりに
かなり調べて試行錯誤してうまくいかなかったのでここまでたどり着くのに時間がかかりました
同じような減少が起きる人はおそらくいるのではないかと思いますので、役立てばうれしいd