自定義註解驗證
阿新 • • 發佈:2019-01-04
註解類
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..;
}