validation字段校验

  • Post author:
  • Post category:其他


1、引入依赖

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

2、编写字段

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
  
    @NotBlank(message = "姓名不能为空")
    private String name;
    
    private int age;
    
    @Pattern(regexp = "^[1][3|5|7|8][0-9]{9}$", message = "手机号格式有误")
    private String tel;
}

3、controller层添加@valid注解

@RequestMapping("/user")
@RestController
public class UserController {
    @PostMapping("/demo")
    public String demo(@RequestBody @Valid User u){
        System.out.println(u);
        return "ok";
    }
}

此时若是请求参数的姓名为空或者手机号格式不正确,则会抛出异常。

这样直接抛异常不太友好,可以通过@RestControllerAdvice处理全局异常,并将异常返回给前端。

4、定义全局异常类

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = BindException.class)
    public JsonResult exceptionHandle(BindException exception) {

        BindingResult result = exception.getBindingResult();
        StringBuilder errorMsg = new StringBuilder();
        List<FieldError> fieldErrors = result.getFieldErrors();
        fieldErrors.forEach(error -> {
            log.error("field: " + error.getField() + ", msg:" + error.getDefaultMessage());
            errorMsg.append(error.getDefaultMessage()).append("!");
        });
        return JsonResult.fail(errorMsg.toString());
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public JsonResult MyExceptionHandle(MethodArgumentNotValidException exception) {

        BindingResult result = exception.getBindingResult();
        StringBuilder errorMsg = new StringBuilder();

        List<FieldError> fieldErrors = result.getFieldErrors();
        fieldErrors.forEach(error -> {
            log.error("field: " + error.getField() + ", msg:" + error.getDefaultMessage());
            errorMsg.append(error.getDefaultMessage()).append("!");
        });

        return JsonResult.fail(errorMsg.toString());
    }

    /**
     * 处理运行时异常
     * @param e
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    public JsonResult doHandleRuntimeException(RuntimeException e) {
        log.error(e.getMessage(), e);
        e.printStackTrace();
        return JsonResult.fail(e.getMessage());
    }
}

JsonResult.java为返回的json

@Data
public class JsonResult<T> {

    private Boolean success;

    private String message;

    private int code;

    private T data;

    /**
     * 操作成功
     * @param message
     * @param data
     * @return
     */
    public static JsonResult ok(String message,Object data){
        JsonResult result = new JsonResult();
        result.setSuccess(true);
        result.setMessage(message);
        result.setCode(200);
        result.setData(data);
        return result;
    }

    /**
     * 操作成功
     * @param message
     * @return
     */
    public static JsonResult ok(String message){
        JsonResult result = new JsonResult();
        result.setSuccess(true);
        result.setMessage(message);
        result.setCode(200);
        result.setData(null);
        return result;
    }

    /**
     * 操作失败
     * @param message
     * @return
     */
    public static JsonResult fail(String message){
        JsonResult result = new JsonResult();
        result.setSuccess(false);
        result.setMessage(message);
        result.setCode(500);
        result.setData(null);
        return result;
    }
}

此时若是输入错误的手机号则会返回相应的错误信息:

{
    "success": false,
    "message": "手机号格式有误!",
    "code": 500,
    "data": null
}

5、自定义注解(自定义校验规则)

1.编写注解

@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyWordValidator.class)
public @interface MyValidator {

    String message();

    // groups 和 payload 这两个parameter 必须包含,不然会报错
    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

2.实现ConstraintValidator接口

public class MyWordValidator implements ConstraintValidator<MyValidator, Object> {
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        // 具体的校验规则,这里是字符长度小于等于10
        return o.toString().length() <= 10;
    }
}

3.使用注解

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @NotBlank(message = "姓名不能为空")
    private String name;

    private int age;

    @Pattern(regexp = "^[1][3|5|7|8][0-9]{9}$", message = "手机号格式有误")
    private String tel;

    @MyValidator(message = "长度为10个字符以下")
    private String saying;
}

一些常用注解

验证注解 验证的数据类型 说明
@AssertFalse Boolean,boolean 验证注解的元素值是false
@AssertTrue Boolean,boolean 验证注解的元素值是true
@NotNull 任意类型 验证注解的元素值不是null
@Null 任意类型 验证注解的元素值是null
@Min(value=值) BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 验证注解的元素值大于等于@Min指定的value值
@Max(value=值) 和@Min要求一样 验证注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值) 和@Min要求一样 验证注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值) 和@Min要求一样 验证注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整数位数, fraction=小数位数) 和@Min要求一样 验证注解的元素值的整数位数和小数位数上限
@Size(min=下限, max=上限) 字符串、Collection、Map、数组等 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@Past java.util.Date,java.util.Calendar;Joda Time类库的日期类型 验证注解的元素值(日期类型)比当前时间早
@Future 与@Past要求一样 验证注解的元素值(日期类型)比当前时间晚
@NotBlank CharSequence子类型 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格
@Length(min=下限, max=上限) CharSequence子类型 验证注解的元素值长度在min和max区间内
@NotEmpty CharSequence子类型、Collection、Map、数组 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型 验证注解的元素值在最小值和最大值之间
@Email(regexp=正则表达式,flag=标志的模式) CharSequence子类型(如String) 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
@Pattern(regexp=正则表达式,flag=标志的模式) String,任何CharSequence的子类型 验证注解的元素值与指定的正则表达式匹配
@Valid 任何非原子类型 指定递归验证关联的对象如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证




版权声明:本文为weixin_50117915原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。