次の方法でBeanValidation 1.2を使用して、Spring MVC RESTサービスを作成しました。
@RequestMapping(value = "/valid")
public String validatedMethod(@Valid ValidObject object) {
}
オブジェクトが有効でない場合、TomcatはThe request sent by the client was syntactically incorrect.
および私のvalidatedMethod
が呼び出されることはありません。
ValidObject
Beanで定義されたメッセージを取得するにはどうすればよいですか?フィルターまたはインターセプターを使用する必要がありますか?
注入されたConstraintViolation
からValidator
sのセットを取得するために、以下のように書き換えることができることはわかっていますが、上記はより整然としています...
@RequestMapping(value = "/valid")
public String validatedMethod(ValidObject object) {
Set<ConstraintViolation<ValidObject>> constraintViolations = validator
.validate(object);
if (constraintViolations.isEmpty()) {
return "valid";
} else {
final StringBuilder message = new StringBuilder();
constraintViolations.forEach((action) -> {
message.append(action.getPropertyPath());
message.append(": ");
message.append(action.getMessage());
});
return message.toString();
}
}
これを行うためのより良い方法は、ExceptionHandler
を使用することだと思います。
Controller
にExceptionHandler
を記述して、さまざまな例外を処理できます。以下は同じためのコードです:
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ValidationFailureResponse validationError(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
final List<FieldError> fieldErrors = result.getFieldErrors();
return new ValidationFailureResponse((FieldError[])(fieldErrors.toArray(new FieldError[fieldErrors.size()])));
}
不正なリクエストをコントローラーに送信すると、バリデーターはタイプMethodArgumentNotValidException
の例外をスローします。したがって、理想的な方法は、この例外を具体的に処理する例外ハンドラーを記述することです。
そこで、問題が発生したことをユーザーに伝えるための美しい応答を作成できます。これを推奨します。これは一度だけ書く必要があり、多くのController
メソッドが使用できるためです。 :)
[〜#〜]更新[〜#〜]
Controller
のメソッド引数に@Validアノテーションを使用すると、バリデーターが自動的に呼び出され、オブジェクトの検証を試みます。オブジェクトが無効な場合は、MethodArgumentNotValidException
をスローします。
Springがこの例外のExceptionHandler
メソッドを見つけると、このメソッド内のコードを実行します。
上記のメソッドがコントローラーに存在することを確認する必要があります。
ここで、メソッドの引数を検証するController
sが複数ある別のケースがあります。この場合、ExceptionResolver
クラスを作成し、このメソッドをそこに配置することをお勧めします。 Controller
sにこのクラスを拡張させれば、作業は完了です。
これを試して
@RequestMapping(value = "/valid")
public String validatedMethod(@Valid ValidObject object, BindingResult result) {
StringBuilder builder = new StringBuilder();
List<FieldError> errors = bindingResult.getFieldErrors();
for (FieldError error : errors ) {
builder.append(error.getField() + " : " + error.getDefaultMessage());
}
return builder.toString();
}