接口字段转实体是否为空判断

来源:互联网 发布:java如何utf8转换为gbk 编辑:程序博客网 时间:2024/06/05 17:08

在开发中如果需要和第三方进行接口交互,这时候对接口字段校验就是必不可少的,对方如果少传字段,或是必传字段为空,如果我们不做判断,很可能导致某个流程出错

一般校验无非就是以下这种处理方式

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 中也做了支持,但推荐使用注解在方法上,在方法上的效率比字段上要高出很多

这只是一个校验的示例,如果用在其他项目里,可能需要进行一定的修改,不过如果大家体会到这种处理思想,相信改起来也费不了多大功夫