@Valid 批量检验优雅
我们在做接口的时候难免都会遇到过一堆基础的检验,比如xxx不能为空,xxx必须大于0等等之类的基础检验吧,
你还在一个用if一个个的编写吗,那些看起来代码是不是非常难看。
今天来跟大家分享一个好用的注解代码,让你的代码更加的清晰可读。
一般保存的接口是一个对象的时候,我们可以直接使用@Valid,如下:
@PostMapping("login")
public Result login(@RequestBody @Valid LoginDTO dto) {
return Result.success(map);
}
但是很多时候都会出现批量保存的操作,那这个时候@Valid就没用了,得用下面另外一种方法
1、创建一个工具类
package com.ninestar.oms.common.valid; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; public class ValidationUtils { public static Validator getValidator(){ return validator; } static Validator validator; static{ ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); validator=validatorFactory.getValidator(); } }
2、控制器那里就不用加@Valid,但是要 在对应的实现类那里加上以下一行代码
List<String> errorMsg = new ArrayList<>(); List<LoginDTO> list = xxxx; Set<ConstraintViolation<LoginDTO>> violations = ValidationUtils.getValidator().validate(list); violations.forEach(error -> errorMsg.add(error.getMessageTemplate())); if (CollectionUtils.isNotEmpty(errorMsg)) { log.error(MessageFormat.format("xxxx【{0}】提交前数据校验失败:【{1}】", financeCreditInquiryApply, JSON.toJSONString(errorMsg))); return CommonResultUtil.fail("数据校验失败" + JSON.toJSONString(errorMsg)); }
最后讲下更多的@Valid中,可以用到的基础校验注解
/** * 空校验 * @Null 用于基本类型上,限制只能为null * @NotNull 用在基本类型上;不能为null,但可以为empty,没有Size的约束 * @NotEmpty 用在集合类上面;不能为null,而且长度必须大于0 * @NotBlank 只能作用在String上,不能为null,而且调用trim()后,长度必须大于0 * * 长度校验 * @Size(max,min) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 * @Length(min=, max=) 验证字符串长度是否在给定的范围之内 * * 日期校验 * @Past 限制必须是一个过去的日期, 并且类型为java.util.Date * @Future 限制必须是一个将来的日期, 并且类型为java.util.Date * @Pattern(value) 限制必须符合指定的正则表达式 * * 数值校验 * @Min(value) 验证 Number 和 String 对象必须为一个不小于指定值的数字 * @Max(value) 验证 Number 和 String 对象必须为一个不大于指定值的数字 * @DecimalMax(value) 限制必须为一个不大于指定值的数字, 小数存在精度 * @DecimalMin(value) 限制必须为一个不小于指定值的数字, 小数存在精度 * @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction * @Digits 验证 Number 和 String 的构成是否合法 * @Range(max =3 , min =1 , message = " ") Checks whether the annotated value lies between (inclusive) the specified minimum and maximum * * 其他校验 * @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email */

浙公网安备 33010602011771号