首页 > 其他分享 >easyexcel导入注解校验

easyexcel导入注解校验

时间:2022-12-30 10:35:15浏览次数:35  
标签:return String easyexcel 校验 枚举 导入 import com public


package com.ruoyi.system.service.imports;

import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.system.service.imports.valid.EnumValidator;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.lang.reflect.Field;
import java.util.Set;

/**
 * @date :Created 2022/12/28 13:00
 * @description :校验工具
 */
public class EasyExcelValidHelper {

    private EasyExcelValidHelper() {
    }

    /**
     * 校验常量
     */
    private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();

    /**
     * description 对象校验
     *
     * @param entity 导入数据
     * @return java.lang.String
     **/
    public static <T> String validateEntity(T entity) throws NoSuchFieldException {
        StringBuilder result = new StringBuilder();
        Set<ConstraintViolation<T>> set = VALIDATOR.validate(entity, Default.class);
        if (set != null && !set.isEmpty()) {
            for (ConstraintViolation<T> cv : set) {
                Field declaredField = entity.getClass().getDeclaredField(cv.getPropertyPath().toString());
                ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
                result.append(annotation.value()[0]).append(cv.getMessage()).append("; ");
            }
        }
        return result.toString();
    }
}

枚举校验

package com.ruoyi.system.service.imports.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @date :Created 2022/12/28 13:00
 * @description :校验枚举注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = EnumValidator.class)
public @interface EnumValid {
    /**
     * 枚举的类型
     */
    Class<?> value();

    /**
     * 错误消息
     *
     * @return
     */
    String message() default "枚举类型的值不正确";

    /**
     * 获取枚举值的方法
     */
    String method() default "getCode";

    String method2() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

package com.ruoyi.system.service.imports.valid;

import com.ruoyi.common.core.utils.bean.BeanUtils;
import org.apache.commons.compress.utils.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @date :Created 2022/12/28 14:40
 * @description :枚举验证
 */
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {

    private static final Logger logger = LoggerFactory.getLogger(EnumValidator.class);

    /**
     * 存具体枚举的值
     */
    private final List<Object> values = Lists.newArrayList();

    @Override
    public void initialize(EnumValid constraintAnnotation) {

        Class<?> enumClazz = constraintAnnotation.value();
        Object[] enumConstants = enumClazz.getEnumConstants();
        if (null == enumConstants) {
            return;
        }
        Method method = BeanUtils.findMethod(enumClazz, constraintAnnotation.method());
        if (null == method) {
            logger.warn("枚举对象:[{}]中不存在方法:[{}],请检查.", enumClazz.getName(), constraintAnnotation.method());
            throw new RuntimeException("枚举对象中不存在获取值的方法");
        }

        method.setAccessible(true);
        try {
            for (Object enumConstant : enumConstants) {
                values.add(method.invoke(enumConstant));
            }
        } catch (IllegalAccessException | InvocationTargetException e) {
            logger.warn("获取枚举类:[{}]的枚举对象的值失败.", enumClazz);
            throw new RuntimeException("获取枚举值失败");
        }

        Method method2 = BeanUtils.findMethod(enumClazz, constraintAnnotation.method2());
        if (null != method2) {
            // method2.setAccessible(true);

            try {
                for (Object enumConstant : enumConstants) {
                    values.add(method2.invoke(enumConstant));
                }
            } catch (IllegalAccessException | InvocationTargetException e) {
                logger.warn("获取枚举类:[{}]的枚举对象的值失败.", enumClazz);
                throw new RuntimeException("获取枚举值失败");
            }
        }
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return null == value || values.contains(value);
    }
}


package com.ruoyi.system.domain.imports;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.ruoyi.system.domain.enums.AppLoginTypeEnum;
import com.ruoyi.system.domain.export.BaseExportData;
import com.ruoyi.system.service.imports.valid.EnumValid;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;

/**
 * 应用导入数据类
 **/
public class AppCfgExcelData extends BaseExportData {

    @Length(max=20)
    @NotBlank(message = "不可空")
    @ColumnWidth(20)
    @ExcelProperty("应用ID")
    private String appId;

    @NotBlank(message = "不可空")
    @ColumnWidth(20)
    @ExcelProperty("应用名称")
    private String appName;

    @NotBlank(message = "不可空")
    @ColumnWidth(20)
    @ExcelProperty("应用类型")
    private String appTypeName;

    @NotBlank(message = "不可空")
    @ColumnWidth(20)
    @ExcelProperty("应用子类型")
    private String appSubtypeName;

    @EnumValid(value = AppLoginTypeEnum.class, method2 = "getName", message = "值不正确")
    @NotBlank(message = "不可空")
    @ColumnWidth(10)
    @ExcelProperty("登录类型")
    private String loginTypeName;

    @NotBlank(message = "不可空")
    @ColumnWidth(10)
    @ExcelProperty("发布状态")
    private String releaseStateName;

    @NotBlank(message = "不可空")
    @ColumnWidth(10)
    @ExcelProperty("显示顺序")
    private String orderNum;

    /**
     * 错误信息
     */
    @ExcelProperty("错误描述")
    private String error;

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppTypeName() {
        return appTypeName;
    }

    public void setAppTypeName(String appTypeName) {
        this.appTypeName = appTypeName;
    }

    public String getAppSubtypeName() {
        return appSubtypeName;
    }

    public void setAppSubtypeName(String appSubtypeName) {
        this.appSubtypeName = appSubtypeName;
    }

    public String getLoginTypeName() {
        return loginTypeName;
    }

    public void setLoginTypeName(String loginTypeName) {
        this.loginTypeName = loginTypeName;
    }

    public String getReleaseStateName() {
        return releaseStateName;
    }

    public void setReleaseStateName(String releaseStateName) {
        this.releaseStateName = releaseStateName;
    }

    public String getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(String orderNum) {
        this.orderNum = orderNum;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}

标签:return,String,easyexcel,校验,枚举,导入,import,com,public
From: https://www.cnblogs.com/stubborn-dude/p/17014229.html

相关文章

  • Python导入模块的3种方式
    2022-12-30很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用import(或from...import)语句引入该文件时,Python解释器同时如下错误:ModuleNotFoundEr......
  • 包的导入和权限修饰符
    为了处理在不同包下的类,我们需要导包,导包的格式和scanner差不多,import加包名同一个类中private,默认的,protected和public都可以访问同一个包下的子类和无关类private无法......
  • 开心档-软件开发入门之MySQL 导入数据
    ......
  • 开心档-软件开发入门之MySQL 导入数据
    ......
  • SiteFactory编辑器支持PowerPoint一键导入
    ​ 百度ueditor新增的将word内容导入到富文本编辑框的功能怎么没有啊,...ueditor实现word文档的导入和下载功能的方法:1、UEditor没有提供word的导入功能,只能说是粘贴复......
  • python3.7导入gevent模块报错的解决方案
    pip3install-U--force-reinstall--no-binary:all:gevent附上参数说明-U,--upgradeUpgradeallspecifiedpackagestothenewestavailableversion.Thehand......
  • SiteFactory编辑器支持pdf自动导入
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,......
  • 表单校验之迭代,数组
      像这种可以添加的数组表单,该怎么校验呢<el-row:gutter="12"class="return-detail-row"v-for="(item,i)inform.orderAnjiContactAddDtoList":key="i">......
  • PE格式:导入表与IAT内存修正
    本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现......
  • conda环境导出导入
    conda环境导出导入1、安装打包工具1)在线安装condainstallconda-pack-cconda-forge2)离线安装离线需要借助一台可联网机器下载,然后在离线机器上安装参考:https://w......