我们写接口经常要做字段必填校验以及字段长度控制,前端访问就以实体类来传参,这样加上注解就可以实现判断字段是否为null,限制字段长度
自定义注解主要是分两部分,一部分是实现的util,一部分就是注解了
字段校验非空注解
package cc.mrbird.febs.server.system.utils;
import java.lang.annotation.*;
/**
* 空指针验证类
*/
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsEmptyAnnotation {
public boolean isEmpty() default true;
public String message() default "字段不能为空!";
}
字段长度判断
package cc.mrbird.febs.server.system.utils;
import java.lang.annotation.*;
/**
* 最大长度验证类
*/
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxSize {
public int max() default 20;
public String message() default "长度太长";
}
package cc.mrbird.febs.server.system.utils;
import java.lang.annotation.*;
/**
* 最小长度验证类
*
*/
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MinSize {
public int min() default 0;
public String message() default "长度太短";
}
下面的util亲测可用
package cc.mrbird.febs.server.system.utils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
/**
* 注解验证处理类
*/
public class AnnotationDealUtil {
private static Logger log = Logger.getAnonymousLogger();
/**
* 注解验证电泳方法
* @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;
}
/**
* 验证是否空值
*
* @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;
}
/**
* 验证最小值
*
* @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;
}
/**
* 验证最大值
*
* @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;
}
//测试
public static void main(String[] args) {
Test test = new Test();
test.setName("11");
test.setAge("");
test.setSex("12");
System.out.println( validate(test));
}
}
测试实体类
package cc.mrbird.febs.server.system.utils;
import lombok.Data;
@Data
public class Test {
@IsEmptyAnnotation
private String name;
@MaxSize(max=2)
private String sex;
@MinSize(min = 1)
private String age;
}