java 自定義註解驗證 (僅限於實體屬性值上的註解)
阿新 • • 發佈:2018-11-27
資源下載地址:http://download.csdn.net/detail/weilai_zhilu/9761533
該驗證主要包含三部分
- 註解驗證類
- 註解處理方法類
- 實體類
- 測試類
第一部分:註解驗證類(此部分暫時只寫了三個驗證類) 下面看程式碼
- 空指標註解類
/** * 空指標驗證類 * * @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