欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能

程序员文章站 2023-03-07 23:20:23
需求: 1实现对字段的非空校验 2实现对邮箱的正则验证 3实现对年龄字段的未成年判断输出: 若字段为空则打印注解传递的message 若邮箱格式正则验证不通过则输出邮箱格式错误 若年龄小于18则打印注解传递的message1 创建一个实体类(getter&&setter略)【下面的所有文件都在同一个包中】public class User { @NotNull() String userid;......

需求:

    1实现对字段的非空校验

    2实现对邮箱的正则验证

    3实现对年龄字段的未成年判断

输出:

    若字段为空则打印注解传递的message

    若邮箱格式正则验证不通过则输出邮箱格式错误

    若年龄小于18则打印注解传递的message

1 创建一个实体类(getter&&setter略)【下面的所有文件都在同一个包中】

public class User {
    @NotNull()
    String userid;

    @NotNull(message = "账号为空")
    String username;

    @Regular("^(\\w-*\\.*)+@(\\w-?)+(\\.\\w{2,})+$")
    String email;

    @NotAdult(message = "该用户未成年")
    int age;

    public User() {
    }

    public User(String userid, String username, String email, int age) {
        this.userid = userid;
        this.username = username;
        this.age = age;
        this.email = email;
    }

}

 

2 创建三个注解接口(NotNull,Regular,NotAdult)

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

/**
 * 验证字段是否不是空
 */
@Target(ElementType.FIELD) //作用于字段
@Retention(RetentionPolicy.RUNTIME) //作用于运行时
public @interface NotNull {
   String message() default "null";//为空时的提示信息,不输入默认为null
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 正则验证
 */
@Target(ElementType.FIELD) //作用于字段
@Retention(RetentionPolicy.RUNTIME) //作用于运行时
public @interface Regular {
    String value() ;//正则表达式,必须输入
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 验证用户是否未成年
 */
@Target(ElementType.FIELD) //作用于字段
@Retention(RetentionPolicy.RUNTIME) //作用于运行时
public @interface NotAdult {
    String message();//未成年的提示信息,必须要输入
}

3 实现注解功能的框架类

import java.lang.reflect.Field;
import java.util.regex.Pattern;

public class MyHibernateValidator {
    public static void main(String[] args) throws Exception {

        //这里本应该自动扫描全部类遍历,时间原因就没有深入完成了,就手动测试下

        //输入四种不同的情况查看结果
        completeAnnotation(new User("001","张三","123zs@qq.com",18));
        completeAnnotation(new User("","张三","123zs.",17));
        completeAnnotation(new User("","","@qq.com.",22));
        completeAnnotation(new User("","","",15));

    }

    //通过泛型方法传递类对象  完成注解的功能
    public static <T> void completeAnnotation(T t){
        //获取要操作的实体类的字节码文件对象
        Class<?> opClass = t.getClass();

        //获取这个对象的所有字段
        Field[] fields = opClass.getDeclaredFields();

        System.out.println("------------开始分隔符-无输出内容则说明验证通过-----------");
        //遍历所有字段,判断字段是否使用了注解
        for(Field f : fields){
            try{
                Object fieldValue = f.get(t);//根据类对象获取字段值对象

                //获取注解对象
                NotNull notNull = f.getAnnotation(NotNull.class); //根据字段对象获取NotNull注解对象
                Regular regular = f.getAnnotation(Regular.class); //根据字段对象获取Regular注解对象
                NotAdult notAdult = f.getAnnotation(NotAdult.class); //根据字段对象获取NotAdult注解对象

                if(f.isAnnotationPresent(NotNull.class)){
                    if(fieldValue == null || fieldValue.toString() == ""){
                        System.out.println(f.getName()+"\t"+notNull.message());//通过message打印信息
                    }
                }
                if(f.isAnnotationPresent(Regular.class)){
                    if(fieldValue != null && fieldValue.toString() != "" ) {
                        String email = fieldValue.toString();
                        if (!Pattern.matches(regular.value(), email)) {
                            System.out.println(f.getName()+"\t"+"email格式错误");
                        }
                    }
                }

                //int类型不能为空,不需要判断
                if(f.isAnnotationPresent(NotAdult.class)){
                    if(fieldValue != null && Integer.parseInt(fieldValue.toString()) < 18){
                        System.out.println(f.getName()+"\t"+notAdult.message());
                    }
                }
            }catch (NullPointerException | IllegalAccessException e){
                e.printStackTrace();
            }
        }

    }
}

 输出结果

Java通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能

 

 

本文地址:https://blog.csdn.net/c_o_d_e_/article/details/107167320