wrongwrongな開発日記

しんまいさんの忘備録

【Kotlin】SpringBootでControllerが受け取った内容をバリデーションするまで【SpringBoot】

↓の続きです。
wrongwrong163377.hatenablog.com
Post/Putで受け取った内容をBeanのバリデーション/相関チェックするところまでやります。
この記事の内容が完了した状態のリポジトリは以下。
github.com

やること

  • モデルを追加する
  • コントローラーを追加する

モデルを追加する

↓のような形でモデルを追加します。
f:id:wrongwrongwrongwrong163377:20181202152857p:plain
持っているのはidと名前、作成日時、更新日時のデータとします。
バリデーション内容は、idがnullチェック、updateがcreateより過去でないかの相関チェックです。

import java.util.*
import javax.validation.constraints.AssertTrue
import javax.validation.constraints.NotNull

data class MyModel(
        @field:NotNull(message = "idはnull不許可")
        val id: Long?,
        val name: String?,
        val create: Date?,
        val update: Date?
) {
    @AssertTrue(message = "updateがcreateより過去")
    fun isLater(): Boolean {
        if(create == null || update == null) return true
        return create.before(update) || create == update
    }
}

Javaのノリでアノテーションをそのまま振ってしまうと正常に動作しないので、@field:...と書く必要があります。
AssertTrue/Falseを使った相関チェックはJavaの時と大差ありません。

コントローラーにメソッドを追加する

前回から引き続いて、以下のようにPostを受け取るコントローラーを追加します。
今回は「Postされた内容を受け取り、文字列として返す」ことをやっています。
@RequestBodyは、Jsonを受け取ってマッピングするためのものです。
@Validatedを付与し、hasErrors()でバリデーション結果をチェックしています。

import com.wrongwrong.modeltest.model.MyModel
import org.springframework.ui.Model
import org.springframework.validation.BindingResult
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("my")
class MyController{
    @GetMapping
    fun myGetTest(model: Model): String{
        return "hello from spring boot"
    }

    @PostMapping
    fun myPostTest(
            @RequestBody @Validated myModel: MyModel,
            bindingResult: BindingResult
    ): String {
        if(bindingResult.hasErrors()){
            return bindingResult.allErrors.toString() + "\n"
        }

        return "post:" + myModel.toString() + "\n"
    }
}

叩いてみる

Curlで叩くと以下のようになります。

エラー無し
$ curl -X POST -H "Content-Type: application/json" -d '{"id":1, "name":"My Name", "create":"2018-11-02", "update":"2018-11-02"}' localhost:8080/my
post:MyModel(id=1, name=My Name, create=Fri Nov 02 09:00:00 JST 2018, update=Fri Nov 02 09:00:00 JST 2018)
idがnull
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"My Name", "create":"2018-11-02", "update":"2018-11-02"}' localhost:8080/my
[Field error in object 'myModel' on field 'id': rejected value [null]; codes [NotNull.myModel.id,NotNull.id,NotNull.java.lang.Long,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [myModel.id,id]; arguments []; default message [id]]; default message [idはnull不許可]]
updateがcreateより過去
$ curl -X POST -H "Content-Type: application/json" -d '{"id":1, "name":"My Name", "create":"2018-11-03", "update":"2018-11-02"}' localhost:8080/my
[Field error in object 'myModel' on field 'later': rejected value [false]; codes [AssertTrue.myModel.later,AssertTrue.later,AssertTrue.boolean,AssertTrue]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [myModel.later,later]; arguments []; default message [later]]; default message [updateがcreateより過去]]

参考にさせていただいた記事

qiita.com
beatdjam.hatenablog.com