反射获取ConstraintViolationException中的PropertyPath属性路径最后一个节点

该博客介绍了如何在处理ConstraintViolationException时,从属性路径中仅获取字段名称。通过源码分析,发现属性路径由多个节点组成,用点号分隔。为获取最后一个节点即属性名称,使用反射获取并截取PathImpl的nodeList属性,从而得到属性字段。示例代码展示了如何操作并存储错误信息到Map中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认获取属性路径

示例代码

@ExceptionHandler(ConstraintViolationException.class)
    public Object handleMethodArgumentNotValidException(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations  = e.getConstraintViolations();
		if (CollectionUtils.isNotEmpty(violations)){
        	violations.getPropertyPath(); // 获取属性路径
            violations.getMessage(); // 获取错误信息
        }
}

示例图

可以看到字段属性路径用于展示哪个字段有问题非常丑陋,例如test.student.addressId这个属性路径,我只需要知道是 addressId这个属性字段有问题就OK,前面多余的路径不想要,可以进入源码来查看propertyPath到底是个啥:

  1. 调用getPropertyPath

  2. 发现propertyPath其实是个Path

  3. Ctrl+Alt+B查看Path的实现类是PathImpl

  4. 查看toString()方法,发现调用asString()

  5. 查看asString(),发现内部其实遍历nodeList这个集合

  6. 多个路径节点源码中是使用.来分割的,PROPERTY_PATH_SEPARATOR这个常量其实就一个点专门用来分割多个路径节点

得出结论

如果只想从路径节点(nodeList)中只拿到属性名称,我们只需要取出最后一位节点即可,而nodeList这个路径节点集合属性属于私有变量,所以需要采取反射暴力获取到nodeList这个属性,然后去最后一位即可。

示例代码

@ExceptionHandler(ConstraintViolationException.class)
    public Object handleMethodArgumentNotValidException(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations  = e.getConstraintViolations();
        if (CollectionUtils.isNotEmpty(violations)){
            Map map = new HashMap<>();
            violations.stream().forEach(x->{
                List<Path.Node> nodeList = ReflectUtils.getFieldValue(x.getPropertyPath(),"nodeList");
                map.put(nodeList.get(nodeList.size() - 1).getName(),x.getMessage());
            });
            return ...;
        }
        return ...;
    }

ReflectUtils.getFieldValue(x.getPropertyPath(),"nodeList"):反射暴力拿到nodeList nodeList.get(nodeList.size()-1.getName(): 使用size()方法获取长度减去1即可获取到最后一位节点,最后调用getName()即可拿到节点名称也就是属性名称

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花伤情犹在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值