判断对象的某些属性是否为空

版权声明:本文为博主原创文章,版权归原作者小思所有,转载或者引用本文内容请注明来源及原作者 https://blog.csdn.net/zeal9s/article/details/90665450

背景:很多时候我们需要判断对象的某些属性中的值是否为空,然后进行操作,这里不需要整个的对象,只是需要获取对象中的某些属性进行判断,如果写很多的if进行判断,例如:

if (StringUtils.isBlank(equipInfo.getCustomerNo())) {//客户编码
...
}
}
if (StringUtils.isBlank(equipInfo.getCustomerRiskLevel())) {//客户风险等级
...
}
if (StringUtils.isBlank(equipInfo.getSaleNo())) {//销售订单号
...
}
...

这样是能达到我们想要的效果,但是我不知道,你的boss看到这段代码之后的反应。。。因为对象的属性一多起来,这if判断无穷尽也,应该使用java的特性来解决实际的问题,很多实际问题都有方案B,所以建议代码进行改良!

方案A:传统方式(对象属性比较少的情况适用)

if (StringUtils.isBlank(equipInfo.getCustomerNo())) {//客户编码
...
}
}
if (StringUtils.isBlank(equipInfo.getCustomerRiskLevel())) {//客户风险等级
...
}
if (StringUtils.isBlank(equipInfo.getSaleNo())) {//销售订单号
...
}
...

方案B:反射(对象属性比较多的情况适用)

/**
* 获取属性名数组
*/
private static String[] getFiledName(Object o) {
  //获取对象的属性数组
  Field[] fields = o.getClass().getDeclaredFields();
  //获取属性名称
  String[] fieldNames = new String[fields.length];
  for (int i = 0; i < fields.length; i++) {
      //获取属性的类型
//            System.out.println(fields[i].getType());
      fieldNames[i] = fields[i].getName();
  }
  return fieldNames;
}

/* 根据属性名获取属性值
*
*/
private static Object getFieldValueByName(String fieldName, Object o) {
  try {
      String firstLetter = fieldName.substring(0, 1).toUpperCase();
      String getter = "get" + firstLetter + fieldName.substring(1);
      Method method = o.getClass().getMethod(getter, new Class[]{});
      Object value = method.invoke(o, new Object[]{});
      return value;
  } catch (Exception e) {

      return null;
  }
}


//main方法测试
public static void main(String[] args) {
        EquipInfo equipInfo = new EquipInfo();
        equipInfo.setCustomerNo("No1234");//客户编码
        equipInfo.setCustomerRiskLevel("A");//客户风险等级
        equipInfo.setSaleNo("SL20190529");//销售订单号
        String[] fieldNames = getFiledName(equipInfo);
        for (int j = 0; j < fieldNames.length; j++) {     //遍历所有属性
            String name = fieldNames[j];    //获取属性的名字
            //判断需要判断的对象某些属性(字段名称)
            if("customerNo".equals(name)||"customerRiskLevel".equals(name)||"saleNo".equals(name)){
                //根据字段获取值
                Object value = getFieldValueByName(name, equipInfo);
                if(value==null){
                    //如果对象的这些属性为空,然后进行的操作...
                    System.out.println(name);
                }
            }


        }

}

方案C:spring框架中的注解@NotNull,@NotBlank,@Valid

实体类:(在需要判断的字段上加上@NotNull注解)

public class EquipInfo{
...
	/**
	 * 设备抵入客户(承租人)
	 */
	private String tenant;
	/**
	 * 客户编码
	 */
	@NotNull(message = "客户编码不能为空")
	@Column(name = "customer_no")
	private String customerNo;
	/**
	 * 客户风险等级
	 */
	@NotNull(message = "客户风险等级不能为空")
	@Column(name = "customer_risk_level")
	private String customerRiskLevel;
	 /**
	 * 销售单号
	 */
	@NotNull(message = "销售单号不能为空")
	@Column(name = "sale_no")
	private String saleNo;
...
}

controller:(加上@Valid注解和BindingResult验证类)

@PostMapping("/createEquipInfo")
public String createEquipInfo(@RequestBody @Valid EquipInfo dto, BindingResult results) { 
	 //如果有为空的,进行的操作...
     if (results.hasErrors()) {
    		 //输出错误的提示信息
            System.out.println(results.getFieldError().getDefaultMessage());
            
      }  
}

还有一些常用的注解:

@Null 被注释的元素必须为null
@NotNull 被注释的元素不能为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内

方案B和方案C的局限性:方案B可以在任意的类或方法中调用,而方法C只适用于controller层次和spring框架

说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

猜你喜欢

转载自blog.csdn.net/zeal9s/article/details/90665450