の取り扱いにおいてスプリングブート結合および検証エラーがRESTコントローラ
{ "gender":"INVALID_INPUT" }
私のRESTコントローラでは、バインディングエラー(gender
プロパティの無効なenum値)と検証エラー(name
プロパティはnullにはできません)の両方を処理したいです。
次コントローラのメソッドは動作しません:
は@RequestMapping(method = RequestMethod.POST)
public Profile insert(@Validated @RequestBody Profile profile, BindingResult result) {
...
}
これは、結合または検証が行われる前にcom.fasterxml.jackson.databind.exc.InvalidFormatException
直列化エラーが発生します。いくつかのあいた後
は、私が何をしたいんこのカスタムコードを思い付いた:
@RequestMapping(method = RequestMethod.POST)
public Profile insert(@RequestBody Map values) throws BindException {
Profile profile = new Profile();
DataBinder binder = new DataBinder(profile);
binder.bind(new MutablePropertyValues(values));
// validator is instance of LocalValidatorFactoryBean class
binder.setValidator(validator);
binder.validate();
// throws BindException if there are binding/validation
// errors, exception is handled using @ControllerAdvice.
binder.close();
// No binding/validation errors, profile is populated
// with request values.
...
}
は、基本的にこのコードが何をするか、一般的なマップの代わりに、モデルにシリアライズして、バインドにカスタムコードを使用していますエラーをモデル化してチェックします。
私は、次の質問がある:
- は、カスタムコードは、ここに行くための方法ですか春ブーツでこれを行うためのより標準的な方法はありますか?
@Validated
注釈はどのように機能しますか?カスタムバインディングコードをカプセル化するために、@Validated
のように機能する独自のカスタムアノテーションを作成するにはどうすればよいですか?
デメリットは、バインディングエラーが発生したときにあなたがBindingResultを得ないということです。私。 'MethodArgumentNotValidException'例外で' ex.getBindingResult() 'を実行できますが、' HttpMessageNotReadableException'例外では実行できません。 –
バインディングが失敗した場合、バインディングの結果を得ることができなかったため、後者は妥当と思われます。拘束力はありません。 –
私の見解では、Stringをintフィールドに入れたり、間違ったEnum値を入れたりするようなバインディングエラーは、検証エラーとして扱われるべきです。また、 'DataBinder'スタンドアロンを使用すると、バインディングフィールドエラーが' BindingResult'にありますので、サービスはより詳細なエラー応答を返すことができます。 –