一般的に、Spring MVC は Hibernate Validator および JSR-303 とうまく統合されることは誰もが知っています。しかし、誰かが言ったように、Hibernate Validator は Bean Validation 専用のものです。つまり、より複雑な検証をデータ層にプッシュする必要があります。このような検証の例: ビジネス キーの一意性、レコード内依存性 (通常、これは DB 設計の問題を指摘するものですが、私たちは皆、不完全な世界に住んでいます)。文字列フィールドの長さなどの単純な検証でさえ、DB 値によって駆動される場合があり、Hibernate Validator が使用できなくなります。
私の質問は、Spring、Hibernate、または JSR がそのような複雑な検証を実行するために提供するものはありますか? Spring と Hibernate に基づく標準の Controller-Service-Repository セットアップで、そのような検証を実行するための確立されたパターンまたはテクノロジの一部はありますか?
更新:より具体的にさせてください。たとえば、AJAX 保存要求をコントローラーのsave
メソッドに送信するフォームがあります。何らかの検証エラー (単純または「複雑」) が発生した場合、ブラウザに戻り、問題のあるフィールドと関連するエラーを示す json が返されます。単純なエラーの場合、フィールド (存在する場合) とエラー メッセージを から抽出できますBindingResult
。「複雑な」エラーに対してどのインフラストラクチャを提案しますか? 例外ハンドラーを使用することは、私には良い考えではないように思えます。なぜなら、save
メソッドとの間で単一の検証プロセスを分離すると@ExceptionHandler
、物事が複雑になるからです。現在、アドホックな例外 (などValidationException
)を使用しています。
public @ResponseBody Result save(@Valid Entity entity, BindingResult errors) {
Result r = new Result();
if (errors.hasErrors()) {
r.setStatus(Result.VALIDATION_ERROR);
// ...
} else {
try {
dao.save(entity);
r.setStatus(Result.SUCCESS);
} except (ValidationException e) {
r.setStatus(Result.VALIDATION_ERROR);
r.setText(e.getMessage());
}
}
return r;
}
より最適なアプローチを提供できますか?