通过反射,对对象中的字段做非空验证

实际接口开发中,发送方传输数据时,可能没有照着定义规范来,必填字段存在空值的情况,这样接收方就需要严格遵循要求,要验证字段是否必填。

常规方式,依次获取对象中的字段来做判断,工作量巨大,并且还容易出错。
所以想了一个公共方法来验证字段是否必填
废话不多说,直接上代码:
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,就是实际返回的信息,可以自定义配置
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值