EasyExcel自定义注解实现导入字段非空校验

一、説明

在使用EasyExcel处理Excel导入文件时,发现并没有官方的有效对字段的非空校验方法;

遂自己写一个自定义注解和字段校验类来实现EasyExcel导入数据的验证。

二、编写自定义注解

首先,我们需要编写一个自定义注解  RequiredValid,用于标记需要校验的字段。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 导入字段校验
 *
 * @author CWW
 * @date 2024/12/19 14:04
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiredValid {

    String message() default "导入有未填入的字段";

}

三、编写字段校验类(类似监听器的作用)

接下来,我们需要编写一个字段校验类 ExcelImportValid,用于在导入过程中对数据进行校验。这个类会遍历传入对象的所有字段,检查这些字段是否被  RequiredValid 注解标记,并且这些字段的值是否为空。

import com.server.easyExcel.annotation.ExcelValid;
import com.server.web.exception.BaseException;

import java.lang.reflect.Field;
import java.util.Objects;

/**
 * 表格导入字段校验
 *
 * @author CWW
 * @date 2024/12/19 14:36
 */
public class ExcelImportValid {

    /**
     * Excel导入字段非空校验
     *
     * @param object 校验的JavaBean 其属性须有自定义注解
     */
    public static void valid(Object object) throws Exception {
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 设置可访问
            field.setAccessible(true);
            // 属性的值
            Object fieldValue = null;
            try {
                fieldValue = field.get(object);
            } catch (IllegalAccessException e) {
                throw new BaseException("导入参数检查失败!");
            }
            // 是否包含必填校验注解
            boolean isRequiredValid = field.isAnnotationPresent(RequiredValid.class);
            if (isRequiredValid && Objects.isNull(fieldValue)) {
                throw new BaseException(field.getAnnotation(RequiredValid.class).message());
            }

        }
    }
}

四、实体字段加注解

在实体类的字段上使用 RequiredValid注解,标记需要校验的字段。假设我们有一个 User 实体类,需要校验 姓名 和 邮箱 字段。

/**
 * 用户导入文件实体
 *
 * @author CWW
 * 2024/12/18 16:46
 */
@Data
public class UserFileDataVO {

    @RequiredValid(message = "姓名字段不能为空!")
    @ExcelProperty(value = "姓名")
    private String userName;

    @ExcelProperty(value = "年龄")
    private int age;

    @RequiredValid(message = "邮箱字段不能为空!")
    @ExcelProperty(value = "邮箱")
    private String email;
}

五、在 AnalysisEventListener 中进行校验

最后需要在 EasyExcel 的 AnalysisEventListener 中

invoke() 方法调用 ExcelImportValid.valid 方法来进行字段校验。AnalysisEventListener 是 EasyExcel 提供的一个事件监听器,可以在读取每行数据时进行处理。

/**
 * EasyExcel工具类
 *
 * @author CWW
 * @date 2024/12/11 16:46
 */
public class EasyExcelUtil {

    private static final String UTF_8 = "UTF-8";

    /**
     * 读取文件数据,并返回一个包含指定类型数据的列表。
     *
     * @param inputStream 文件对象输入流
     * @param clazz       数据对象的类型
     * @param <T>         泛型类型,表示数据对象的类型
     * @return 包含解析后数据对象的列表
     */
    public static <T> List<T> readMultipartFile(InputStream inputStream, Class<T> clazz) {
        // 用于存储解析后的数据对象
        final List<T> dataList = new ArrayList<>();

        EasyExcel.read(inputStream, clazz, new AnalysisEventListener<T>() {
            @Override
            public void invoke(T data, AnalysisContext analysisContext) {
                try {
                    // 调用字段校验方法
                    ExcelImportValid.valid(data);
                    
                    // 将解析后的数据对象添加到 dataList中
                    dataList.add(data);
                } catch (Exception e) {
                    throw new BaseException(e.getMessage());
                }
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                // 读取完成后可以进行一些操作
            }
        }).sheet().doRead(); // 读取 Excel 文件中的第一个工作表

        // 返回解析后数据对象的列表
        return dataList;
    }

五、总结

通过上述步骤,我们实现了一个灵活的Excel导入数据校验机制。

如果这篇教学文章对你有所帮助,不妨点个赞和收藏。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值