资源下载地址: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