在开发中如果需要和第三方进行接口交互,这时候对接口字段校验就是必不可少的,对方如果少传字段,或是必传字段为空,如果我们不做判断,很可能导致某个流程出错
一般校验无非就是以下这种处理方式
if(requestVo.getName == null || requestVo.getName.equals("")){
// 自定义异常处理
throw new CustomException("必传字段不能为空");
};
当然这种处理方式是没有问题的,但是如果我们的接口中好几十个必传字段呢?如果是20 个字段,每个字段校验最少2行,那就是40行的代码,这就是我们不想要的了
下面来介绍另一种处理方法,使用注解反射的方式来校验字段
1、定义注解,作用在方法
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Required {
public String value() default "";
}
2、要校验的实体类
public class Student {
private String name;
private String age;
private String gender;
@Required
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Required
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Required
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
3、注解工具类
public class AnnotionUtils {
/**
* 注解在字段上
*/
public static String validateField(Object obj) {
StringBuffer message = new StringBuffer();
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
Object object = field.get(obj);
if (field.isAnnotationPresent(Required.class)) {
if (object == null || String.valueOf(object).trim().equals("")) {
message.append(field.getName() + "不能为空");
}
}
}
} catch (Exception e) {
System.out.println("校验失败" + e);
}
return message.toString();
}
/**
* 注解在方法上
*/
public static String validateMethod(Object obj) {
StringBuffer message = new StringBuffer();
Class<?> clazz = obj.getClass();
Method[] methods = clazz.getDeclaredMethods();
try {
for (Method method : methods) {
if (method.isAnnotationPresent(Required.class)) {
method.setAccessible(true);
if (method.invoke(obj, new Object[] {}) == null
|| String.valueOf(method.invoke(obj, new Object[] {})).trim().equals("")) {
message.append(splitGetMethod(method.getName()) + "不能为空");
}
}
}
} catch (Exception e) {
System.out.println("校验失败" + e);
}
return message.toString();
}
/**
* 分割 get 方法获取字段
*/
private static String splitGetMethod(String methodName) {
if (methodName == null || methodName.equals("")) {
return "";
}
methodName = methodName.trim();
if (methodName.startsWith("get") && methodName.length() > 3) {
return methodName.substring(3);
} else {
return methodName;
}
}
}
4、测试
public class TMain {
public static void main(String[] args) {
Student student = new Student();
student.setName("注解测试");
String validateMsg = AnnotionUtils.validateMethod(student);
System.out.println(validateMsg);
}
5、测试结果
6、总结
不需要使用 if 来判断字符串是否空了,不管字段有多长,一行代码就搞定所有字段的为空校验,代码看起来就舒服多了
示例中我们使用了注解在方法上,当然我们也可以把注解放到字段上,类似下面这样
这样实体类的代码看起来清晰很多,注解在字段上也可以进行校验在 AnnotationUtil 中也做了支持,但推荐使用注解在方法上,在方法上的效率比字段上要高出很多
这只是一个校验的示例,如果用在其他项目里,可能需要进行一定的修改,不过如果大家体会到这种处理思想,相信改起来也费不了多大功夫