记录一次@Accessors(chain = true) 引发的BeanUtils的反射问题

在JDK7和Tomcat7环境下,使用了@Accessors(chain = true)注解的bean对象在调用BeanUtils.setProperty时遇到问题,由于setter方法返回对象this,导致反射无法正确设置值。生产环境中出现该问题,而在测试和本地环境正常。解决方案包括使用FluentPropertyBeanIntrospector或自定义BeanIntrospector来处理链式setter方法。
摘要由CSDN通过智能技术生成

环境:JDK7,tomcat7

问题:bean对象使用了@Accessors(chain = true) 注解,

  • 在调用BeanUtils.setProperty(t, field.getName(), objvalue);

  • 由于链式调用重写了 set方法返回值为对象this,导致BeanUtils调用反射获取set方法时获取不到,最终没有对需要值的对象set进入值

  • 但是实际测试和本地环境可以获取到值,而生产环境获取不到

    网上找到拿不到值的原因

cglib中使用 Java rt.jar包中的java.beans.Introspector类,在java.beans.Introspector类520行:只获取返回值是void类型的setxxxx方法,而@Accessors(chain=true)下setter方法返回当前对象,这个显然会有问题。

                     if (argCount == 0) {
                         if (name.startsWith(GET_PREFIX)) {
                             // Simple getter
                             pd = new PropertyDescriptor(this.beanClass, name.substring(3), method, null);
                         } else if (resultType == boolean.class && name.startsWith(IS_PREFIX)) {
                             // Boolean getter
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值