实际接口开发中,发送方传输数据时,可能没有照着定义规范来,必填字段存在空值的情况,这样接收方就需要严格遵循要求,要验证字段是否必填。
常规方式,依次获取对象中的字段来做判断,工作量巨大,并且还容易出错。
所以想了一个公共方法来验证字段是否必填
废话不多说,直接上代码:
ResponseMessageBean responseMessageBean = ValidationNotEmptyUtil.returnMessage(Object)
public static ResponseMessageBean returnMessage(Object object){
List<Object> verify = new ArrayList<>();
ResponseMessageBean messageBean = new ResponseMessageBean();
messageBean.setStatus(ResponseMessageCodeBean.OK.getCode());
messageBean.setMessage(ResponseMessageCodeBean.OK.getInfo());
verify.add(object);
for (Object o : verify) {
try {
String message = VerifyTheFieldUtil.checkObjFieldIsNull(o);
if(Optional.ofNullable(message).isPresent()){
messageBean.setStatus(ResponseMessageCodeBean.PART.getCode());
messageBean.setMessage(message);
break;
}
} catch (IllegalAccessException e) {
messageBean.setStatus(ResponseMessageCodeBean.ERR.getCode());
messageBean.setMessage("验证报文出错");
}
}
return messageBean;
}
public static String checkObjFieldIsNull(Object obj) throws IllegalAccessException {
//如果想要一次性返回所以错误信息,那就不用String来接收报错信息,也不要中途返回
//用拼接的方式,最后一步返回所有数据信息
String message = null;
//根据传过来的对象,打破封装,获取里面的属性值
for(Field f : obj.getClass().getDeclaredFields()){
f.setAccessible(true);
//判断属性值不是null,并且(是集合类型并且不是空的集合对象)
if(f.get(obj)!=null && (f.get(obj).getClass().equals(java.util.ArrayList.class) &&
ValidationNotEmptyUtil.validationArrayIsNotNull((List<?>) f.get(obj)))){
//循环这个集合对象,再次请求方法,或者集合中的所有字段属性
for (Object o : (List<?>) f.get(obj)) {
message = checkObjFieldIsNull(o);
if(message!=null){
return message;
}
}
}else{
//如果不是集合类型或者属性为空,就直接来判断属性值是否为Null或者为空字符串,是的话直接抛出
if(f.get(obj) == null || "".equals(f.get(obj)) || (f.get(obj).getClass().equals(java.util.ArrayList.class) &&
((List<?>)f.get(obj)).size()==0)){
//System.out.println(f.getName()+"为空");
//message = f.getName()+"为空";
Annotation annotation = f.getDeclaredAnnotation(NotNull.class);
//如果没有设置当前注解 不用校验
if(annotation == null){
continue;
}
//获取注解接口对象
NotNull notNull = (NotNull)annotation;
if(StringUtils.isNotBlank(notNull.message())){
//设置了注解message值 直接返回
message = notNull.message();
}
}
}
//如果返回数据不是null,直接返回报错信息
if(message!=null){
return message;
}
}
return null;
}
ResponseMessageBean 是自己建的公共返回信息
public class ResponseMessageBean {
/**
* status : OK
* message : success
*/
private String status;
private String message;
}
这样还没有完,最后一步,在实体中,对非空字段加上注解
public class InBoundResultNG007AndNG008Bean {
/**
* ownerId : 1
* orders : [{"dcId":"","orderNo":"","refOrderNo":"","orderType":"","receiptNo":"","status":"","vendorId":"","receiptTime":"","remark":"","items":[{"lineNo":"1","erpLineNo":"","skuNo":"","uom":"","qty":"","price":"","lot":"","receiptStatus":"","invStatus":"","lotAttr0":"","lotAttr1":"","lotAttr2":"","lotAttr3":""}]}]
*/
@NotNull(message = "ownerId is null")
private String ownerId;
@NotNull(message = "orders is null")
private List<OrdersBean> orders;
@NoArgsConstructor
@Data
public static class OrdersBean {
/**
* dcId :
* orderNo :
* refOrderNo :
* orderType :
* receiptNo :
* status :
* vendorId :
* receiptTime :
* remark :
* items : [{"lineNo":"1","erpLineNo":"","skuNo":"","uom":"","qty":"","price":"","lot":"","receiptStatus":"","invStatus":"","lotAttr0":"","lotAttr1":"","lotAttr2":"","lotAttr3":""}]
*/
@NotNull(message = "dcId is null")
private String dcId;
@NotNull(message = "orderNo is null")
private String orderNo;
@NotNull(message = "refOrderNo is null")
private String refOrderNo;
@NotNull(message = "orderType is null")
private String orderType;
@NotNull(message = "receiptNo is null")
private String receiptNo;
private String status;
private String vendorId;
private String receiptTime;
private String remark;
@NotNull(message = "items is null")
private List<ItemsBean> items;
@NoArgsConstructor
@Data
public static class ItemsBean {
/**
* lineNo : 1
* erpLineNo :
* skuNo :
* uom :
* qty :
* price :
* lot :
* receiptStatus :
* invStatus :
* lotAttr0 :
* lotAttr1 :
* lotAttr2 :
* lotAttr3 :
*/
@NotNull(message = "lineNo is null")
private String lineNo;
@NotNull(message = "erpLineNo is null")
private String erpLineNo;
@NotNull(message = "skuNo is null")
private String skuNo;
@NotNull(message = "uom is null")
private String uom;
@NotNull(message = "qty is null")
private String qty;
private String price;
private String lot;
@NotNull(message = "receiptStatus is null")
private String receiptStatus;
@NotNull(message = "invStatus is null")
private String invStatus;
private String lotAttr0;
private String lotAttr1;
private String lotAttr2;
private String lotAttr3;
}
}
}
注解上的message,就是实际返回的信息,可以自定义配置