背景:很多时候我们需要判断对象的某些属性中的值是否为空,然后进行操作,这里不需要整个的对象,只是需要获取对象中的某些属性进行判断,如果写很多的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框架