EasyExcel导入数据校验(hibernate-validator)

前言

最近做项目,在使用EasyExcel做数据导入的时候,没有找到什么好的数据校验方法,很多博客都是直接写代码进行校验,感觉很麻烦,因此思考能不能有什么简便的方法。大家都知道web项目,在controller层的方法上加@Validated注解,调用接口的时候会自动进行参数校验,于是思考能不能通过同样的方法对EasyExcel导入的数据进行校验。@Validated是通过hibernate.validator包来实现的,通过看源码,发现javax.validation.ValidatorFactory,通过这个入手,写一个方便的,数据导入校验方法。

思路

Controller层的方法,是spring框架自动调用hibernate校验方法校验,这里我们考虑手动调用hibernate校验方法,既能用hibernate本来自带的一些类似于@NotNull,@NotBlank等注解,也能通过自定义注解扩展@Constraint(validatedBy = { }),用这一套大大提高了代码的复用率。

实现

records是EasyExcel导入定义的实体类list,headNums是表头占的行数

@Slf4j
public class ExcelValidtor<T> {

    public void valid(List<T> records,int headNums)throws ValidException {
        if(records == null || records.size() == 0){
            throw new ValidException(Collections.singletonList(new ErrorMessage(ErrorCode.API,"数据不能为空")));
        }
        HibernateValidatorConfiguration configure = Validation.byProvider(HibernateValidator.class).configure();
        ValidatorFactory validatorFactory = configure.failFast(false).buildValidatorFactory();
        // 根据validatorFactory拿到一个Validator
        Validator validator = validatorFactory.getValidator();
        // 使用validator对结果进行校验
        List<ErrorMessage> errorMsgs = new ArrayList<>();
        for(int a = 0;a<records.size();a++){
            Set<ConstraintViolation<T>> result = validator.validate(records.get(a));
            for(ConstraintViolation constraintViolation:result){
                try {
                    T object = (T)constraintViolation.getLeafBean();
                    ExcelProperty excelProperty = object.getClass().getDeclaredField(constraintViolation.getPropertyPath().toString()).getAnnotation(ExcelProperty.class);
                    String[] value = excelProperty.value();
                    String header = Arrays.stream(value).collect(Collectors.joining(","));
                    ErrorMessage errorMessage = new ErrorMessage(ErrorCode.API,"第"+(headNums+a+1)+"行:"+header+constraintViolation.getMessage());
                    errorMsgs.add(errorMessage);
                } catch (NoSuchFieldException e) {
                    log.error(e.getMessage());
                }
            }
        }
        if (errorMsgs != null && errorMsgs.size() > 0){
            throw new ValidException(errorMsgs);
        }
    }
}

这里的ValidException是自定义的异常类型,其实可以直接用BindException,让全局ExceptionHandler统一处理,这里由于我想加一个列名和行号,所以没这么用。列名通过反射获取@ExcelProperty的属性取得。

@Data
public class ValidException extends Exception{

    private List<ErrorMessage> errorMessages;

    public ValidException(List<ErrorMessage> errorMessages){
        this.errorMessages = errorMessages;
    }

    public ValidException(){}
}
@Getter
@Setter
public class ErrorMessage {

  private String code;

  private String content;

  public ErrorMessage() {
  }

  public ErrorMessage(String code) {
    this(code, null);
  }

  public ErrorMessage(String code, String content) {
    this.code = code;
    this.content = content;
  }

  public static ErrorMessage of(String code, String content) {
    return new ErrorMessage(code, content);
  }
}

调用

try{
	ExcelValidtor excelValidtor = new ExcelValidtor();
	excelValidtor.valid(uploadRecords,1);
}catch (ValidException e) {
}

效果

{
  "code": "1000",
  "content": "第2行:姓名不能为null"
},
{
  "code": "1000",
  "content": "第3行:姓名不能为null"
},
{
  "code": "1000",
  "content": "第3行:年龄不能为null"
},
{
  "code": "1000",
  "content": "第3行:住址不能为null"
}

问题

目前这块,我感觉行数的计算可能会有点问题,因为没有确认过,EasyExcel的导入,空行会不会给空数据,如果是直接忽略空行的话,行数就会错误。等后续有时间再确认。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 是一个基于Java的Excel工具,提供了方便易用的导入、导出、读写Excel等功能。在使用EasyExcel导入数据时,我们通常需要进行数据校验,以保证数据的准确性和完整性。下面是对EasyExcel导入数据校验的一些介绍: 1、数据校验的目的。通过对数据进行校验,可以检查数据的格式、类型、范围等是否符合要求,避免数据导入后出现问题,减少后续的处理工作。 2、数据校验的方式。EasyExcel提供了数据校验的三种方式:基于注解、基于自定义校验器和基于表头匹配。基于注解是通过在实体类属性上加注解的方式进行校验;基于自定义校验器是用户自定义校验器类,继承EasyExcel的IExcelDataValidator接口,实现校验逻辑;基于表头匹配是通过匹配表头名称,判断导入数据是否符合规定。 3、数据校验的具体实现。在使用EasyExcel进行数据导入时,我们可以在读取数据之前,加上相应的数据校验逻辑。通过校验器对数据进行校验,设置成功或者失败的回调函数,来处理校验结果。如对于校验失败的数据,可以进行错误提示或者忽略处理。 4、数据校验的结论。通过EasyExcel进行数据导入时,可以进行数据校验,避免了数据导入后出现各种问题。如果校验结果全部通过,那么可以放心将数据导入到业务中进行处理。如果校验结果有不通过的,可以根据具体情况进行处理,忽略不重要的,或者重新进行数据导入操作。 总之,EasyExcel是一个非常实用的Excel工具,通过数据校验,可以大大提高数据的准确性和完整性,减少后续的处理工作,可以更好地服务于业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值