【Java】使用@Valid+BindingResult进行controller参数校验
@Valid
@Valid注解用于校验,所属的包: javax.validation.Valid.
你可以定义实体,在实体的属性上添加校验规则,在API接收数据时添加@Valid注解,这时你的实体将会开启一个校验的功能。
## 空检查
@NotEmpty:用在集合类上面;不能为null,而且长度必须大于0
@NotBlank: 用在String上面;只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotNull:用在基本类型上;不能为null,但可以为empty。
## 长度检查
@Size(min=,max=):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
不要错用了异常类型,比如在int上不可用@size
@Length(min=, max=) : 只适用于String 类型
## Booelan检查
@AssertTrue: 验证 Boolean 对象是否为 true
@AssertFalse: 验证 Boolean 对象是否为 false
## 日期检查
@Past: 验证 Date 和 Calendar 对象是否在当前时间之前
@Future: 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern: 验证 String 对象是否符合正则表达式的规则
## 数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为"" 时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min: 验证 Number 和 String 对象是否大等于指定的值
@Max: 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax: 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin: 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits: 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=): 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
BindingResult
Spring验证的错误返回
@Valid 和 BindingResult 是一一对应的,如果有多个@Valid,那么每个@Valid后面跟着的BindingResult就是这个@Valid的验证结果,顺序不能乱 1.首先在参数实体类上面加上相关的验证信息
public class PublicUserForm implements Serializable { private static final long serialVersionUID = 1L; /** * 手机号 */ @NotBlank(message = "{required}") @Pattern(regexp = RegexpConstant.MOBILE_REG, message = "{mobile}") private String telephone; /** * 密码 */ private String password;
2.controller层
public ResponseResult regist(@Valid PublicUserForm publicUserForm, BindingResult bindingResult) throws Exception { //在这里,我们判断参数是否通过校验 if (bindingResult.hasErrors()) { Map<String,String> errorMsg = new HashMap<>(); for (FieldError item:bindingResult.getFieldErrors()) { errorMsg.put(item.getField(),item.getDefaultMessage()); } //自定义的返回,并将错误信息返回 return new ResponseResult(false,200, JSON.toJSONString(errorMsg),errorMsg); } PublicUser publicUser = publicUserService.regist(publicUserForm); return new ResponseResult(true,200,"访问成功!",null); }