1. 程式人生 > >自定義註解驗證

自定義註解驗證

註解類


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

@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Attribute {
    // 欄位屬性說明
    String name() default
""; // 欄位是否強制校驗必填,優於required,在任何校驗方法內都會校驗該欄位是否為空 boolean everyRequired() default false; // 欄位是否必填 boolean required() default false; // 欄位固定長度限制 int length() default 0; // 欄位最大長度限制 int maxLength() default 0; // 日期型別格式限制 String dateFormat() default ""; // 賦值限制列表,用於下拉列表
String[] valueSetLimit() default {}; }

驗證類


import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;
import java.text.ParseException;
import java.text
.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.hikvision.annotation.Attribute; import java.util.Arrays; public class ParamVaildate { /*** * 設定類屬性的註解值,設定後該註解值將持續生效,若只是暫時需要改變,請在結束後再次呼叫更改回去 * * @param object * 物件類 * @param atts * 屬性陣列 * @param anns * 註解陣列 * @param values * 更改後的註解值陣列 */ public static void setAttributeAnnotation(Object object, String[] atts, String[] anns, Object[] vals) { for (int i = 0; i < atts.length; i++) { setAttributeAnnotation(object, atts[i], anns[i], vals[i]); } } public static void setAttributeAnnotation(Object object, String att, String ann, Object val) { try { Field field = object.getClass().getDeclaredField(att); InvocationHandler h = Proxy.getInvocationHandler(field.getAnnotation(Attribute.class)); Field hField = h.getClass().getDeclaredField("memberValues"); hField.setAccessible(true); Map memberValues = (Map) hField.get(h); memberValues.put(ann, val); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /*** * 驗證類所有屬性 * * @param object * @return */ public static Map<String, Object> vaildateAll(Object object) { Map<String, Object> vailMap = new HashMap<String, Object>(); if (object == null) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "驗證的物件為空,請檢查"); return vailMap; } vailMap.put("errorCode", "0"); Field[] fields = object.getClass().getDeclaredFields(); try { for (Field field : fields) { // 排除static屬性 if (Modifier.isStatic(field.getModifiers())) { continue; } Attribute att = field.getAnnotation(Attribute.class); // 排除沒有註解的屬性 if (att == null) { continue; } String value = (String) object.getClass() .getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1)) .invoke(object); // 強制校驗必填 if (att.everyRequired() && StringUtils.isEmpty(value)) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 必填校驗 if (att.required() && StringUtils.isEmpty(value)) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 固定長度校驗 if (value != null && att.length() > 0 && value.length() != att.length()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")固定長度限制為" + att.length() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 最大長度校驗 if (value != null && att.maxLength() > 0 && value.length() > att.maxLength()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")最大長度限制為" + att.maxLength() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 日期型別校驗 if (value != null && att.dateFormat().length() > 0) { SimpleDateFormat sdf = new SimpleDateFormat(att.dateFormat()); try { sdf.parse(value); } catch (ParseException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")日期型別限制為" + att.dateFormat() + "格式,請檢查引數"); break; } } // 賦值限制列表校驗 if (value != null && att.valueSetLimit().length > 0) { boolean limitFlag = false; for (int index = 0; index < att.valueSetLimit().length; index++) { if (value.equals(att.valueSetLimit()[index])) { limitFlag = true; continue; } } if (!limitFlag) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")賦值限制列表為" + Arrays.toString(att.valueSetLimit()) + ",當前設值為'" + value + "'不符合規範,請檢查引數"); break; } } } } catch (NoSuchMethodException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "未在對應的實體中找到該方法:" + e.getMessage()); } catch (IllegalArgumentException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (InvocationTargetException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (SecurityException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } return vailMap; } /*** * 驗證類所有非空屬性 * * @param object * @return */ public static Map<String, Object> vaildateIsNotNulllAtt(Object object) { Map<String, Object> vailMap = new HashMap<String, Object>(); if (object == null) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "驗證的物件為空,請檢查"); return vailMap; } vailMap.put("errorCode", "0"); Field[] fields = object.getClass().getDeclaredFields(); try { for (Field field : fields) { // 排除static屬性 if (Modifier.isStatic(field.getModifiers())) { continue; } Attribute att = field.getAnnotation(Attribute.class); // 排除沒有註解的屬性 if (att == null) { continue; } String value = (String) object.getClass() .getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1)) .invoke(object); // 強制校驗必填 if (att.everyRequired() && StringUtils.isEmpty(value)) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 非空且必填,不為空字元校驗 if (value != null && att.required() && "".equals(value.trim())) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 固定長度校驗 if (value != null && att.length() > 0 && value.length() != att.length()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")固定長度限制為" + att.length() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 最大長度校驗 if (value != null && att.maxLength() > 0 && value.length() > att.maxLength()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")最大長度限制為" + att.maxLength() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 日期型別校驗 if (value != null && att.dateFormat().length() > 0) { SimpleDateFormat sdf = new SimpleDateFormat(att.dateFormat()); try { sdf.parse(value); } catch (ParseException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")日期型別限制為" + att.dateFormat() + "格式,請檢查引數"); break; } } } } catch (NoSuchMethodException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "未在對應的實體中找到該方法:" + e.getMessage()); } catch (IllegalArgumentException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (InvocationTargetException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (SecurityException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } return vailMap; } /*** * 根據傳入的類名稱和屬性陣列驗證 * * @param object * @param atts * @return */ public static Map<String, Object> vaildateAtts(Object object, String[] atts) { Map<String, Object> vailMap = new HashMap<String, Object>(); if (object == null) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "驗證的物件為空,請檢查"); return vailMap; } vailMap.put("errorCode", "0"); try { for (int i = 0; i < atts.length; i++) { Field field = object.getClass().getDeclaredField(atts[i]); Attribute att = field.getAnnotation(Attribute.class); // 排除沒有註解的屬性 if (att == null) { continue; } String value = (String) object.getClass() .getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1)) .invoke(object); // 強制校驗必填 if (att.everyRequired() && StringUtils.isEmpty(value)) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 必填校驗 if (att.required() && StringUtils.isEmpty(value)) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")不允許為空,請檢查引數"); break; } // 固定長度校驗 if (value != null && att.length() > 0 && value.length() != att.length()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")固定長度限制為" + att.length() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 最大長度校驗 if (value != null && att.maxLength() > 0 && value.length() > att.maxLength()) { vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")最大長度限制為" + att.maxLength() + ",實際長度為" + value.length() + ",請檢查引數"); break; } // 日期型別校驗 if (value != null && att.dateFormat().length() > 0) { SimpleDateFormat sdf = new SimpleDateFormat(att.dateFormat()); try { sdf.parse(value); } catch (ParseException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", field.getAnnotation(Attribute.class).name() + "(" + field.getName() + ")日期型別限制為" + att.dateFormat() + "格式,請檢查引數"); break; } } } } catch (NoSuchFieldException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "未在對應的實體中找到該屬性:" + e.getMessage()); } catch (NoSuchMethodException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", "未在對應的實體中找到該方法:" + e.getMessage()); } catch (IllegalArgumentException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (SecurityException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } catch (InvocationTargetException e) { e.printStackTrace(); vailMap.put("errorCode", "1"); vailMap.put("errorMessage", e.getMessage()); } return vailMap; } }

model類

public class PartnerModel{
    @Attribute(name = "名稱", everyRequired = true, dateFormat = "YYYY-MM-DD")
    private String name;
    setget..;
}