添加依赖(springboot2.3以下版本已经集成validation,不用单独引入依赖)

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

实体类参数校验

** 实体类**


    @NotNull(message = "id不能为空")
    private Integer id;

    @Email(message = "邮箱格式不正确", regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$")
    @NotBlank(message = "name不能为空")
    private String email;

    @Min(value = 1, message = "年龄必须大于1岁")
    @Max(value = 150, message = "年龄必须小于150岁")
    private Integer age;

Controller方法接受实体类时,须单独在实体类前加上@Validated注解才能生效


    @RequestMapping("/getTest")
    public HashMap<String, Object> getTest(@Validated Demo demo) {

        return new HashMap<String, Object>(2) {{
            put("test", demo);
        }};
    }

Bean Validation 的注解:

QQ截图20210603101732.png

Hibernate Validator的注解:

QQ截图20210603101837.png

@NotNull、@NotEmpty、@NotBlank的区别:

@NotNull:任何对象的value不能为null
@NotEmpty:集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank:只能用于字符串不为null,并且字符串trim()以后length要大于0

单个参数或者多个参数校验

单独接受参数时只需要在Controller上加@Validated注解


@CrossOrigin
@RestController
@RequestMapping("/test")
@Validated
public class TestController {


    @RequestMapping("/setTest")
    public HashMap<String, Object> setTest(
            @NotNull(message = "test不能为空!") String test,
            @NotNull(message = "id不能为空") String id
    ) {
        return new HashMap<String, Object>(2) {{
            put("test", test);
            put("id", id);
        }};
    }


}

全局异常处理

/**
 * 异常处理器
 *
 * @author Range
 */
@RestControllerAdvice
public class ExceptionHandlerConfiguration {

    /**
     * 单个或者多个参数校验异常捕获
     * 
     * @param e 
     * @param request
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public HashMap<String, Object> constraintViolationException(ConstraintViolationException e, HttpServletRequest request) {
        HashMap<String, Object> result = new HashMap<>();

        try {

            Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();

            for (ConstraintViolation<?> constraintViolation : constraintViolations) {

                String params = constraintViolation.getPropertyPath().toString();

                String param = params.split("\\.")[1];

                result.put(param, constraintViolation.getMessage());
            }

            return result;

        } catch (Exception exception) {

            return result;
        }
    }

    /**
     * 实体类校验异常捕获
     * 
     * @param e 
     * @return
     */
    @ExceptionHandler(BindException.class)
    public HashMap<String, Object> parameterMissingExceptionHandler(BindException e) {

        HashMap<String, Object> result = new HashMap<>();

        try {

            for (FieldError fieldError : e.getFieldErrors()) {

                result.put(fieldError.getField(), fieldError.getDefaultMessage());

            }

            return result;

        } catch (Exception exception) {
            return result;
        }

    }

}