@Valid 手工嵌套验证

使用反射来对对象里的 属性进行验证

 //初始化检查器。
    static ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
            .configure()
            .failFast(true)
            .buildValidatorFactory();
    static Validator validator = validatorFactory.getValidator();

    public static void validate(Object object) {
        List<LinkedHashMap<String, Object>> result = new ArrayList<>();
        serviceValid(object, result);
        if (ObjectUtil.isNotEmpty(result)) {
            throw new WDTException(JSON.toJSONString(result));
        }
    }

    private static void serviceValid(Object object, List<LinkedHashMap<String, Object>> result) {
        try {
            LinkedHashMap<String, Object> msg = new LinkedHashMap<>();

            //检查object
            Set<ConstraintViolation<Object>> set = validator.validate(object);
            List<String> list = new ArrayList<>();
            //循环set,获取检查结果
            for (ConstraintViolation<Object> voset : set) {
                list.add("key:" + voset.getPropertyPath() + ", err msg:" + voset.getMessage() + ";");
            }
            Class classInfo = object.getClass();
            if (ObjectUtil.isNotEmpty(list)) {
                msg.put("className", classInfo.getName());
                msg.put("errMsg", JSON.toJSONString(list));
                result.add(msg);
            }
            Field[] fields = classInfo.getDeclaredFields();//Object是已经被赋值的对象实例
            for (Field field : fields) {
                Type genericFieldType = field.getGenericType();
                Valid valid = field.getAnnotation(Valid.class);
                //如果存在这个注解
                if (ObjectUtil.isNotEmpty(valid)) {
                    //如果是List
                    if (genericFieldType instanceof ParameterizedType) {
                        //打开私有访问
                        field.setAccessible(true);
                        //获取属性值
                        Object value = field.get(object);
                        if (ObjectUtil.isEmpty(value)) {
                            LinkedHashMap<String, Object> msg1 = new LinkedHashMap<>();
                            msg1.put("className", field.getName());
                            msg1.put("errMsg", "不能为空!");
                            result.add(msg1);
                            continue;
                        }
                        Collection cloneable = (Collection) value;
                        //拿到List的值
                        for (Object obj : cloneable) {
                            serviceValid(obj, result);
                        }
                    } else {//获取属性值
                        //打开私有访问
                        field.setAccessible(true);
                        Object value = field.get(object);
                        serviceValid(value, result);
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值