基于注解的通用数据验证

本文探讨如何基于注解和反射实现通用的数据验证。通过定义注解、正则枚举,结合反射机制,实现对参数的合法性校验,简化项目中数据验证的代码,提高工作效率。文章详细介绍了注解的定义、枚举规则、实现与调用过程,并指出这种方法的灵活性和对反射的运用。
摘要由CSDN通过智能技术生成

前言

在项目开发交互过程中,难免会遇到一些数据校验。以校验客户端发送数据的合法性,对于一些非空校验,我们也许可以使用@NonNull,@NotNull 等注解,可是对于一些常规的,如手机号,身份证等等的校验,我们就还要判断处理每个请求的参数的合法性。

但是合法性的判断是难以避免的,我们是否可以精简工作量、提高工作效率呢。

思考

我们或许应该从@NonNull @NotNull等其他注解那里受到些启发。

我们或许可以结合正则表达式及注解对某些通用数据进行验证。

注解可以设置参数,我们可以设置参数为校验规则,通过枚举列举出来,同时也应该允许用户自定义正则等校验。

我们知道,注解有三种类型

RetentionPolicy.SOURCE

RetentionPolicy.CLASS

RetentionPolicy.RUNTIME。

SOURCE主要用于编译之前,编译过程中会被丢弃如@Override注解。

CLASS主要用于编译,运行时会被丢弃。

RUNTIME在源码,编译,运行时始终会存在。

可以利用反射,拿到具有特定注解的bean,并处理。所以我们定义的注解应该是RUNTIME类型。同时声明注作用范围为FIELD及PARAMETER。

实践

定义注解

/**
 * 数据验证注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({
    ElementType.FIELD,ElementType.PARAMETER})
public @interface DataValid {
    
	
	//是否可以为空
	boolean nullable() default false;
	
	//提供几种常用的正则验证
	RegexType regexType() default RegexType.NONE;
	
	//自定义正则验证
	String regexExpression() default "";
	
	//参数或者字段描述
	String description() default "";

}

定义如上注解,nullable用来校验参数是否可空,默认不可以为空,false。

同时提供几种通用的正则校验,用枚举列出,如手机号码校验,身份证信息校验等等。

同时如果没有规定的正则表达式,可以让用户自定义自己的正则表达式。

另增加描述字段,用来说明这个paramer的用途。

定义常用正则枚举

/**
 * 正则类型枚举
 */
public enum RegexType {
    
	
	NONE,
	SPECIALCHAR,
	CHINESE,
	EMAIL,
	IP, 
	NUMBER,
	NUMBERORNIL,
	PHONENUMBER,
	ID;
	
}

列出几种常用枚举。非空,特殊字符,中文,邮箱,IP,数字等等

枚举规则

定义了枚举,要定义它们的具体对应的方法,以便后续调用。

/**
 * 常用正则表达式
 */
public class RegexUtils {
    

	/**
	 * 判断是否是正确的IP地址
	 *
	 * @param ip
	 * @return boolean true,通过,false,没通过
	 */
	public static boolean isIp(String ip) {
    
		if (null == ip || "".equals(ip))
			return false;
		String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
				+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
				+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
				+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
		return ip.matches(regex);
	}

	/**
	 * 判断是否是正确的邮箱地址
	 *
	 * @param email
	 * @return boolean true,通过,false,没通过
	 */
	public static boolean isEmail(String email) {
    
		if (null == email || "".equals(email))
			return false;
		String regex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
		return email.matches(regex);
	}

	/**
	 * 判断是否含有中文,仅适合中国汉字,不包括标点
	 * @param text
	 * @return boolean true,通过,false,没通过
	 */
	public static boolean isChinese(String text) {
    
		if (null == text || "".equals(text))
			return false;
		Pattern p = Pattern.<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值