web-dev-qa-db-ja.com

SpringBean検証@有効な処理

次の方法で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からValidatorsのセットを取得するために、以下のように書き換えることができることはわかっていますが、上記はより整然としています...

@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();
    }
}
13
Dormouse

これを行うためのより良い方法は、ExceptionHandlerを使用することだと思います。

ControllerExceptionHandlerを記述して、さまざまな例外を処理できます。以下は同じためのコードです:

@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メソッドを見つけると、このメソッド内のコードを実行します。

上記のメソッドがコントローラーに存在することを確認する必要があります。

ここで、メソッドの引数を検証するControllersが複数ある別のケースがあります。この場合、ExceptionResolverクラスを作成し、このメソッドをそこに配置することをお勧めします。 Controllersにこのクラスを拡張させれば、作業は完了です。

25
dharam

これを試して

@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();
}
6
usha