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

本文介绍了一种利用注解反射机制校验接口字段的方法,避免了传统if判断带来的冗余代码,使得字段校验更加简洁高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

判断一个包含实体类的对象集合是否时,需要考虑以下几个方面: 1. **集合是否为 `null`**:在进行任何操作之前,首先需要确认集合本身是 `null`,以避免在调用方法时引发 `NullPointerException` 异常。 2. **集合是否**:使用集合类提供的 `isEmpty()` 方法可以直观地判断集合是否包含元素。此方法在 `List`、`Set` 等接口中均有定义,且逻辑清晰、代码简洁。 3. **实体类对象是否**:如果集合中包含的是实体类对象,还需要确保集合中至少存在一个非实体类对象。如果集合中所有对象都为 `null`,则即使集合本身,也可能符合业务逻辑中的“非”要求。 ### 判断逻辑 可以按照以下步骤进行判断: 1. **检查集合是否为 `null`**:避免在对象上调用方法。 2. **检查集合是否**:使用 `isEmpty()` 方法判断集合是否包含元素。 3. **检查集合中是否存在非实体类对象**:遍历集合,确认其中至少有一个非对象。 ### 示例代码 以下是一个完整的判断逻辑示例: ```java import java.util.List; public class EntityUtils { /** * 判断包含实体类对象的集合是否 * @param list 需要判断的集合 * @return 如果集合为 null、为,或者所有元素都为 null,则返回 true;否则返回 false */ public static boolean isEntityListEmpty(List<Entity> list) { if (list == null || list.isEmpty()) { return true; } // 检查集合中是否存在非实体类对象 for (Entity entity : list) { if (entity != null) { return false; } } // 如果集合中所有对象都为 null,则认为集合为 return true; } } class Entity { // 实体类的定义 } ``` ### 说明 - **`list == null`**:用于判断集合本身是否为 `null`。 - **`list.isEmpty()`**:用于判断集合是否集合。 - **遍历集合**:确保集合中至少存在一个非实体类对象。如果集合中所有对象都为 `null`,则认为集合为。 ### 优化建议 - 如果需要频繁判断集合是否,可以将上述逻辑封装成一个工具类方法,便于复用和维护。 - 如果集合中存储的是复杂对象,还可以进一步扩展判断逻辑,例如检查对象的某些字段是否等。 ### 示例调用 ```java List<Entity> entityList = new ArrayList<>(); if (EntityUtils.isEntityListEmpty(entityList)) { System.out.println("集合为"); } else { System.out.println("集合"); } ``` 通过上述方法,可以有效地判断一个包含实体类的对象集合是否,确保在业务逻辑中正确处理集合的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值