Springboot 使用注解@Validated和BindingResult校验参数

1、创建一个参数对象

# Validation
package common.validate.type
    public class Validation {

    /**查询*/
    public interface Select {
    }
    /**更新*/
    public interface Update {
    }
    /**插入*/
    public interface Insert {
    }
    /**删除*/
    public interface Delete {
    }

    /**查询详情*/
    public interface SelectDetail {
    }

}

import java.util.List;
import common.validate.type.Validation;

import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;

public class Parameter {

    @NotEmpty(message="姓名不能为空", groups = Validation.Update.class)
    private String name;

    @Min(value = 18, message = "年龄必须大于18岁", groups = Validation.Update.class)
    private int age;

    @NotEmpty(message="hobbies不能为空", groups = Validation.Update.class)
    private List<String> hobbies;

    @NotBlank(message="账号不能为空", groups = Validation.Update.class)
    private String account;

    @Size(min=5,max=10,message="密码的长度应该在5和10之间", groups = Validation.Update.class) 
    private String password;

    @Email(message="邮箱格式错误", groups = Validation.Update.class)
    private String email;

    // Getter and Setter
    // ... 

}

2、controller控制层写参数接收的入口

public class BaseController {
    /**
    * 正常的返回值
    *
    * @param outPutBean
    */
    protected void setSuccess(BaseVO outPutBean) {
        outPutBean.setResultCode(ConstantsRecruit.ResultCode.SUCCESS);
    }

    /**
    * 处理参数异常
    *
    * @param bindingResult
    */
    protected void paramaterVidation(BindingResult bindingResult) throws Exception {
        if (bindingResult.hasErrors()) {
            StringBuilder errorMesssage = new StringBuilder("参数异常:");
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                errorMesssage.append(fieldError.getField());
                errorMesssage.append(":");
                errorMesssage.append(fieldError.getDefaultMessage());
                errorMesssage.append("; ");
            }
            throw new TestAplException(ConstantsRecruit.ResultCode.PARAM_ERR, errorMesssage.toString());
        }
    }
}


# 注意:BindingResult需要放到@Validated后面

public class TestController extends BaseController{

    @ApiOperation(value = "测试", notes = "更新")
    @PostMapping(value = "/update")
    public BaseVO update(@RequestBody @Validated(Validation.Update.class) Parameter input,BindingResult bindingResult){
        paramaterVidation(bindingResult);
        BaseVO vo = new BaseVO();
        commonService.update();
        setSuccess(vo);
        return vo;
    }
}

3、常用校验注解

@Null 只能是null
@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值
@AssertFalse 必须为false
@AssertTrue 必须是true

字符串/数组/集合检查:(字符串本身就是个数组)
@Pattern(regexp=”reg”) 验证字符串满足正则
@Size(max, min) 验证字符串、数组、集合长度范围
@NotEmpty 验证字符串不为空或者null
@NotBlank 验证字符串不为null或者trim()后不为空

数值检查:同时能验证一个字符串是否是满足限制的数字的字符串
@Max 规定值得上限int
@Min 规定值得下限
@DecimalMax(“10.8”) 以传入字符串构建一个BigDecimal,规定值要小于这个值
@DecimalMin 可以用来限制浮点数大小
@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2
@Digits 无参数,验证字符串是否合法
@Range(min=long1,max=long2) 检查数字是否在范围之间
这些都包括边界值

日期检查:Date/Calendar
@Post 限定一个日期,日期必须是过去的日期
@Future 限定一个日期,日期必须是未来的日期

其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL