Spring Bean验证@Valid处理

Dor*_*use 12 java spring-mvc bean-validation

我使用Bean Validation 1.2使用以下方法创建了一个Spring MVC REST服务:

@RequestMapping(value = "/valid")
public String validatedMethod(@Valid ValidObject object) {

}
Run Code Online (Sandbox Code Playgroud)

如果object无效,Tomcat会通知我,The request sent by the client was syntactically incorrect.validatedMethod的调用永远不会被调用.

如何获取ValidObjectbean 中定义的消息?我应该使用一些过滤器或拦截器吗?

我知道我可以像下面一样重写,ConstraintViolation从注入中得到一组s Validator,但上面看起来更整洁......

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

dha*_*ram 23

我相信更好的方法是使用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()])));
}
Run Code Online (Sandbox Code Playgroud)

向Controller发送错误请求时,验证程序会抛出类型异常MethodArgumentNotValidException.所以理想的方法是编写一个异常处理程序来专门处理这个异常.

在那里,您可以创建一个美丽的响应,告诉用户出错的地方.我提倡这个,因为你必须只写一次,许多Controller方法都可以使用它.:)

UPDATE

当您对方法参数使用@Valid注释时Controller,将自动调用验证器并尝试验证该对象,如果该对象无效,则抛出该对象MethodArgumentNotValidException.

如果Spring找到了ExceptionHandler这个异常的方法,它将执行此方法中的代码.

您只需要确保控制器中存在上述方法.

现在有另一种情况,当Controller你想要验证方法参数的多个s 时.在这种情况下,我建议你创建一个ExceptionResolver类并将此方法放在那里.让你Controller扩展这个课程,你的工作就完成了.

  • 这是您的自定义响应类.我说你可以制作并发送你想要的任何响应对象:) (2认同)

ush*_*sha 5

尝试这个

@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();
}
Run Code Online (Sandbox Code Playgroud)