@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
 */

 

posted @ 2025-12-30 14:55  有缘无分的朋友  阅读(3)  评论(0)    收藏  举报