java 自定义注解验证 (仅限于实体属性值上的注解)

资源下载地址:http://download.csdn.net/detail/weilai_zhilu/9761533

该验证主要包含三部分

  1. 注解验证类
  2. 注解处理方法类
  3. 实体类
  4. 测试类

第一部分:注解验证类(此部分暂时只写了三个验证类) 下面看代码

  1. 空指针注解类
/**
 * 空指针验证类
 * 
 * @author zhy
 * @date 2017/2/22
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsEmptyAnnotation {
	public boolean isEmpty() default true;
	
	public String message() default "字段不能为空!";
}

2.最大长度注解类

/**
 * 最大长度验证类
 * 
 * @author zhy
 * @date 2017/2/22
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxSize {
	public int max() default 20;
 
	public String message() default "长度太长";
}

3.最小长度注解类

/**
 * 最小长度验证类
 * 
 * @author zhy
 * @date 2017/2/22
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MinSize {
	public int min() default 0;
 
	public String message() default "长度太短";
}

第二部分:注解处理类(此处我将处理的调用方法和每个注解的处理方法写在一个类中,如果想分开也可拆开)下面看代码

/**
 * 注解验证处理类
 * 
 * @author zhy
 * @date 2017/2/22
 */
public class AnnotationDealUtil {
	private static Logger log = Logger.getAnonymousLogger();
 
	/**
	 * 注解验证电泳方法
	 * 
	 * @author zhy
	 * @param bean 验证的实体
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> validate(Object bean) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("message", "验证通过");
		result.put("result", true);
		Class<?> cls = bean.getClass();
		
		// 检测field是否存在
		try {
			// 获取实体字段集合
			Field[] fields = cls.getDeclaredFields();
			for (Field f : fields) {
				// 通过反射获取该属性对应的值
				f.setAccessible(true);
				// 获取字段值
				Object value = f.get(bean);
				// 获取字段上的注解集合
				Annotation[] arrayAno = f.getAnnotations();
				for (Annotation annotation : arrayAno) {
					// 获取注解类型(注解类的Class)
					Class<?> clazz = annotation.annotationType();
					// 获取注解类中的方法集合
					Method[] methodArray = clazz.getDeclaredMethods();
					for (Method method : methodArray) {
						// 获取方法名
						String methodName = method.getName();
						// 过滤错误提示方法的调用
						if(methodName.equals("message")) {
							continue;
						}
						// 初始化注解验证的方法处理类 (我的处理方法卸载本类中)
						Object obj = AnnotationDealUtil.class.newInstance();
						// 获取方法
						try {
							// 根据方法名获取该方法
							Method m = obj.getClass().getDeclaredMethod(methodName, Object.class, Field.class);
							// 调用该方法
							result = (Map<String, Object>)m.invoke(obj, value, f);
							/* 验证结果 有一处失败则退出 */
							if(result.get("result").equals(false)) {
								return result;
							}
						} catch (Exception e) {
							e.printStackTrace();
							log.info("找不到该方法:"+methodName);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.info("验证出错");
		}
		return result;
	}
 
	/**
	 * 验证是否空值
	 * 
	 * @author zhy
	 * @param value 参数值
	 * @param field 字段
	 * @return
	 */
	public Map<String, Object> isEmpty(Object value, Field field) {
		Map<String, Object> validateResult = new HashMap<String, Object>();
		IsEmptyAnnotation annotation = field.getAnnotation(IsEmptyAnnotation.class);
		if(value == null || value.equals("")) {
			validateResult.put("message", field.getName() + annotation.message());
			validateResult.put("result", false);
		} else {
			validateResult.put("message", "验证通过");
			validateResult.put("result", true);
		}
		return validateResult;
	}
	
	/**
	 * 验证最小值
	 * 
	 * @author zhy
	 * @param value 参数值
	 * @param field 字段
	 * @return
	 */
	public Map<String, Object> min(Object value, Field field) {
		Map<String, Object> validateResult = new HashMap<String, Object>();
		MinSize annotation = field.getAnnotation(MinSize.class);
		if(value != null && value.toString().length() < annotation.min()) {
			validateResult.put("message", annotation.message());
			validateResult.put("result", false);
		} else {
			validateResult.put("message", "验证通过");
			validateResult.put("result", true);
		}
		return validateResult;
	}
	
	/**
	 * 验证最大值
	 * 
	 * @author zhy
	 * @param value 参数值
	 * @param field 字段
	 * @return
	 */
	public Map<String, Object> max(Object value, Field field) {
		Map<String, Object> validateResult = new HashMap<String, Object>();
		MaxSize annotation = field.getAnnotation(MaxSize.class);
		if(value != null && value.toString().length() > annotation.max()) {
			validateResult.put("message", annotation.message());
			validateResult.put("result", false);
		} else {
			validateResult.put("message", "验证通过");
			validateResult.put("result", true);
		}
		return validateResult;
	}
}

第三部分:实体类 (实体类中对注解的调用)

/**
 * 广告实体类
 * 
 * @author zhy
 * @date 2017/2/22
 * 
 */
public class Advertise {
	private Long id;
	
	@IsEmptyAnnotation(message="图片地址不能为空")
	private String images;
	
	@MinSize(min=5)
	@MaxSize(max=10)
	private String title;
	
	private String url;
	
	private Date startTime;
	
	private Date endTime;
	
	private Date createTime;
	
	private Date lastModifiedTime;
 
	public Long getId() {
		return id;
	}
 
	public void setId(Long id) {
		this.id = id;
	}
 
	public String getImages() {
		return images;
	}
 
	public void setImages(String images) {
		this.images = images;
	}
 
	public String getTitle() {
		return title;
	}
 
	public void setTitle(String title) {
		this.title = title;
	}
 
	public String getUrl() {
		return url;
	}
 
	public void setUrl(String url) {
		this.url = url;
	}
 
	public Date getStartTime() {
		return startTime;
	}
 
	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}
 
	public Date getEndTime() {
		return endTime;
	}
 
	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}
 
	public Date getCreateTime() {
		return createTime;
	}
 
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
 
	public Date getLastModifiedTime() {
		return lastModifiedTime;
	}
 
	public void setLastModifiedTime(Date lastModifiedTime) {
		this.lastModifiedTime = lastModifiedTime;
	}
}

第四部分:测试类

public class AnnotationTest {
 
	public static void main(String[] args) {
		Advertise advertise = new Advertise();
		advertise.setImages("a");
		advertise.setTitle("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
		System.out.println(AnnotationDealUtil.validate(advertise));
	}
 
}

B
D
D
D
A
A
A
C
C
D
C
B
D
C
C
F
F
T
T
F
F
T
F
F
F
A、C
A、C
A、B、D
A、B、C、D
A、B、C

猜你喜欢

转载自blog.csdn.net/weinichendian/article/details/81365858