↓の続きです。
wrongwrong163377.hatenablog.com
Post/Putで受け取った内容をBeanのバリデーション/相関チェックするところまでやります。
この記事の内容が完了した状態のリポジトリは以下。
github.com
やること
- モデルを追加する
- コントローラーを追加する
モデルを追加する
↓のような形でモデルを追加します。
持っているのは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より過去]]