* 備忘録 [#oa4a49d9]
** spring bootでバリデーションチェックのレスポンスをカスタマイズ [#q3a31302]
バリデーションチェックで弾く場合、コントローラ層まで処理が進まないため、いくつかやることがあります。
*** 事前にリクエストされたパラメータを保持しておきたい。 [#v8558a58]
スレッドローカルに保存するのが良いです
スレッドローカルを操作するライブラリに、org.slf4j.MDCがあります。
**** バリデーション前に処理を行う [#sb84dd43]
@Aspect
を指定したクラスを用意します。
メソッドには、
@Before("within(org.springframework.stereotype.コントローラ)")
とかいれます。
ここでスレッドローカルに値をいれておくわけです。
Httpのリクエストは、RequestContextHolderのrequestAttributes.requestにあります。
スレッドで値を共有したくはないので、後始末として
@AfterReturning("org.springframework.stereotype.コントローラ")
または
@After("org.springframework.stereotype.コントローラ")
とかいれます。
** バリデーションエラー後 [#s5704ad2]
@ControllerAdviceで指定したクラスで、@ExceptionHandlerで指定したメソッドで受けます。注意点としては、戻り値は、ResponseEntity<Object>とObject型にするのがコツです。