1. 程式人生 > >java 自定義註解驗證 (僅限於實體屬性值上的註解)

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