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

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

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值