自定义注解实现excel导入数据参数校验
创始人
2024-05-24 08:46:28
0

目录

  • 一 自定义注解
    • 1.元注解
      • 1.1简单介绍
    • 2 声明注解
  • 二 校验工具类
  • 三 进行校验

一 自定义注解

1.元注解

我们在自定义的注解上要添加几个元注解

@Target
@Retention
@Inherited
@Documented

1.1简单介绍

@Target
用来声明当前注解可以使用的地方

value描述
ElementType.TYPE应用于类、接口(包括注解类型)、枚举
ElementType.FIELD应用于属性(包括枚举中的常量)
ElementType.METHOD应用于方法
ElementType.PARAMETER应用于方法的形参
ElementType.CONSTRUCTOR应用于构造函数
ElementType.LOCAL_VARIABLE应用于局部变量
ElementType.ANNOTATION_TYPE应用于注解类型
ElementType.PACKAGE应用于包
ElementType.TYPE_PARAMETER应用于类型变量
ElementType.TYPE_USE应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

@Retention
表明该注解的生命周期

生命周期类型描述
RetentionPolicy.SOURCE编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASSJVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME由JVM 加载,包含在类文件中,在运行时可以被获取到

@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解。

@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化。

一般声明自定义注解的时候 使用前三个就够了

2 声明注解

// {} 中可以声明多个Target类型, 这个注解我们只用在类的属性上, 只注明这一个值即可
@Target({ElementType.FIELD})
// 在运行时使用
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ExcelValid {
// 注解的属性 
// 属性声明格式 :   数据类型  属性名()  default  默认值;
// 在调用获取属性值的时候  直接通过 ' 注解对象.属性名()' 的形式int length() default 0;DataTypeEnum type() default DataTypeEnum.String;boolean notNull() default true;String lengthMessage() default "";String typeMessage() default "";String notNullMessage() default "";
}

这样注解就声明好了

二 校验工具类

编写校验工具类

/*** 导入excel参数校验*/
public class ExcelValidUtil {/*** Excel导入字段校验** @param object 校验的JavaBean 其属性须有自定义注解*/public static void Excelvalid(Object object) throws RuntimeException {valid(object,0);}public static void Excelvalid(Object object, int size) throws RuntimeException {valid(object,size);}private static void valid(Object object,int size) throws RuntimeException {String prefix = "";if (size > 0) {prefix = "第" + size + "条数据";}// 通过反射获取类的所有属性字段Field[] fields = object.getClass().getDeclaredFields();for (Field field : fields) {//设置可访问field.setAccessible(true);// 进行判断 如果属性上有 @ExcelIgnore 注解或者没有 @ExcelProperty则表示该字段不参数映射, 跳过if (field.isAnnotationPresent(ExcelIgnore.class) || !field.isAnnotationPresent(ExcelProperty.class)) {continue;}//属性的值Object fieldValue = null;try {fieldValue = field.get(object);} catch (IllegalAccessException e) {throw new RuntimeException("导入参数检查失败");}//是否包含自定义校验注解boolean hasValid = field.isAnnotationPresent(ExcelValid.class);if (hasValid ) {// 获取自定义注解ExcelValid annotation = field.getAnnotation(ExcelValid.class);// 非空校验boolean notNull = annotation.notNull(); // 获取注解notNull属性的值if (notNull && Objects.isNull(fieldValue)) {throw new RuntimeException(prefix + " " +annotation.notNullMessage());}// 类型校验DataTypeEnum type = annotation.type(); // 获取注解type属性的值if (!validType(type,fieldValue)) {throw new RuntimeException(prefix + " " +annotation.typeMessage());}// 长度校验int length = annotation.length(); // 获取注解length属性的值if (length > 0) {if (length < String.valueOf(fieldValue).length()) {throw new RuntimeException(prefix + " " +annotation.lengthMessage());}}}}}// 类型转换校验private static Boolean validType(DataTypeEnum type,Object fieldValue) {try {switch (type){case Byte: Byte.valueOf(String.valueOf(fieldValue)); break;case Short: Short.valueOf(String.valueOf(fieldValue)); break;case Integer: Integer.valueOf(String.valueOf(fieldValue)); break;case Long: Long.valueOf(String.valueOf(fieldValue)); break;case Float: Float.valueOf(String.valueOf(fieldValue)); break;case Double: Double.valueOf(String.valueOf(fieldValue)); break;case String: String.valueOf(fieldValue); break;case BigDecimal: new BigDecimal(String.valueOf(fieldValue)); break;case Boolean: Boolean.valueOf(String.valueOf(fieldValue)); break;default: break;}}catch (Exception e){// 转换失败返回falsereturn false;}return true;}
}

三 进行校验

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...