如何使用Spring Boot实现REST服务验证?

时间:2018-04-16 12:08:51

标签: validation spring-boot

假设我有以下DTO:

public class UserDTO {

    public Long id;

    @NotEmpty
    public String name;

    @Email
    @NotEmpty
    public String email;

    @NotEmpty
    @Size(min = 11, max = 11)
    public String phone;

}

我发送以下json:

{
    "name": "John Lennon",
    "email": "jonnlennon"
}

我想使用以下正文返回错误422:

[{
    "email": "it's not a valid mail"
}, {
    "phone": "required field"
}]

如何在验证错误发生时实现通用@ControllerAdvice来处理?对于每个验证错误,我会在属性文件中获得相应的消息。

2 个答案:

答案 0 :(得分:0)

  1. 使用rest controller advice来全局处理验证错误。

  2. 确保在休息控制器中为方法中的请求主体添加符号@Validation。

    @RestControllerAdvice 公共类CustomExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public ErrorResponse processValidationError(MethodArgumentNotValidException ex){ BindingResult result = ex.getBindingResult(); FieldError错误= result.getFieldError(); return error.getDefaultMessage(); }

答案 1 :(得分:0)

我创建了一个表示我的错误的类:

public class ErrorDetails {

    private String property;
    private String message;

    public ErrorDetails(String property, String message) {
        super();
        this.property = property;
        this.message = message;
    }

    // getter and setter
}

并配置我的 @ControllerAdvice ,如下所示:

@ControllerAdvice
public class RestExceptionHandler {

    //others handlers

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleMethodArgumentNotValid(MethodArgumentNotValidException exception){

        List<ErrorDetails> errors = new ArrayList<>();

        if (exception.getBindingResult().hasErrors()) {
            exception.getBindingResult().getFieldErrors().forEach(error -> {
                errors.add(new ErrorDetails(error.getField(), error.getDefaultMessage()));
            });
        }

        return ResponseEntity.unprocessableEntity().body(errors);
    }
}