@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

这篇具有很好参考价值的文章主要介绍了@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Accessors是由lombok提供的一个注解,chain = true的作用是使成员属性的set方法不再返回void,而是返回对象本身,从而实现链式赋值。效果如下:

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

然而加了该注解后,我发现 org.apache.commons.beanutils.BeanUtils.copyProperties(final Object dest, final Object orig)方法失效。

经试验发现,当我用 org.springframework.beans.BeanUtils.copyProperties(Object source, Object target)方法时仍然能够正常赋值。所以以此为切入点进行源码分析,查找原因。

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

springframework的copyProperties方法链路追踪

关键点在于它是如何剥离出Goods类的2个set方法并进行后续调用赋值。

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

进入getPropertyDescriptors方法继续追踪链路,来到 org.springframework.beans.ExtendedBeanInfoFactory#getBeanInfo,这里的supports(beanClass)对Goods类的所有方法进行了判断,即 是否声明或继承了任何返回非void的set方法。

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

此时如果Goods没有@Accessors注解,这一步会return null,然后退回到org.springframework.beans.CachedIntrospectionResults#getBeanInfo(java.lang.Class<?>)方法,最终return Introspector.getBeanInfo(beanClass)

Introspector.getBeanInfo是一个由jdk提供的方法,传入Goods类后会返回一个BeanInfo.java,其中包含了Goods成员属性的get方法、set方法。但如果是@Accessors注解后的特殊set方法,是无法获取到的。

继续进入new ExtendedBeanInfo 构造方法,ExtendedBeanInfo继承了BeanInfo.java,它对于Goods类的set方法返回非void的情况进行了适配。具体代码如下:

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

所以说,spring提供的copyProperties方法,声明了一个单独的ExtendedBeanInfo.java 用于适配 set方法返回非void的情况。

 apache.commons的copyProperties方法链路追踪

 思路同上,当追踪到org.apache.commons.beanutils.DefaultBeanIntrospector#introspect的时候,发现其底层也是调用了jdk提供的Introspector.getBeanInfo方法,且没有适配这种特殊的set方法,最终导致无法成功获取到Goods类的set方法,赋值失败。

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路

总结

org.springframework.beans.BeanUtils.copyProperties 和 org.apache.commons.beanutils.BeanUtils.copyProperties 这2个方法其本质上都是调用了由jdk提供的Introspector.getBeanInfo方法来获取对象的默认get、set方法。但是spring对set方法返回非void的情况进行了适配,使得set方法能够正常调用。所以我们在使用@Accessors(chain = true)时要留意,不能使用apache.commons的BeanUtils 来对其进行赋值,因为其未对这种特殊的set方法进行适配。

拓展延伸

@Accessors注解除了chain属性外,还有一个名为fluent的boolean属性

当fluent=true时,属性名的get、set方法将去掉“get、set”前缀,即 goods.name()、goods.name("goodsName") 来表示get、set方法。此时无论springframework还是apache.commons,他们的copyProperties均会失效,goods无法通过这2个方法来设置属性。

@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路文章来源地址https://www.toymoban.com/news/detail-491432.html

到了这里,关于@Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JPA连接达梦数据库导致auto-ddl失效问题解决

      现象:         项目使用了JPA,并且auto-ddl设置的为update,在连接达梦数据库的时候,第一次启动没有问题,但是后面重启就会报错,发现错误为重复建表,也就是说已经建好的表没有检测到,又重新走的建表流程。经过一天的排查,总结了2个解决方案。  问题的根源:

    2024年02月15日
    浏览(63)
  • VUE 若依框架,当页面设置了keepAlive=true,v-if和v-hasPermi作用在统一个按钮上时v-hasPermi失效,出现按钮显示异常问题

     当前列表页设置了缓存keepAlive=true,同时,在同一个按钮上使用 v-if 判断数据状态、用 v-hasPermi 判断按钮权限 当 v-if 的数据状态改变,由 ==1 变成 ==2 的时候,后面的v-hasPermi判断失效 原因: 是因为一开始页面初始化时,v-if 判断前两行为 true , 后两行没有在页面渲染元素,

    2024年02月03日
    浏览(41)
  • 【微信小程序】底部弹窗固定定位fixed+textarea,导致的adjust-position在安卓手机失效问题

    安卓手机测试时候发现,fixed固定定位导致键盘弹出时,textarea无法正常被顶上去。 然后我就尝试了第二种方法用scroll-view将高度设置为100vh时,将页面保持在视口高度,这个时候发现不管是弹窗是fixed还是absolute都无法让安卓手机的键盘弹出时textarea顶上去 最后我用了最后一种

    2024年01月18日
    浏览(51)
  • vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

    参考文章 重构vue2项目时发现的问题,原始项目使用的是 Element-ui 。 其实vue3可以使用适配的 Element-plus 问题描述 el-form表单无法输入 控制台报错 Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option. 使用响应式变量时应先声明 解决办法

    2024年02月15日
    浏览(43)
  • MySQL会导致索引失效的情况与解决索引失效的方法

    什么情况会导致索引失效 索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些: 1.使用 SELECT * 进行查询; 2.创建了组合索引,但查询条件未准守最左匹配原则; 3.在索引列上进行计算、函数、类型转换等操作; 4.以 % 开头的 LIKE 查询比如 like \\\'%abc\\\'; ; 5.查

    2023年04月08日
    浏览(74)
  • 【数据库】哪些操作会导致索引失效

    🍎 个人博客: 个人主页 🏆 个人专栏: 数据库 ⛳️   功不唐捐,玉汝于成 目录 前言 正文 结语  我的其他博客   在数据库管理中,索引的有效性对于查询性能至关重要。然而,索引可能会因为各种操作而失效,从而影响到数据库的性能和稳定性。了解导致索引失效的常

    2024年02月19日
    浏览(45)
  • MySQL查询条件OR导致模糊查询失效

    起因:查出来的列表数据,通过查询条件过滤,发现过滤条件并不起作用 检查发现:where查询条件里面有or的过滤条件,用来进行权限控制,模糊查询条件本来是起效果的,但是OR的条件一执行,就有多了些数据 代码: 期望的结果:先查出来所有符合要求的,然后再根据过滤

    2024年01月22日
    浏览(46)
  • Elasticsearch Mapping字段未支持索引导致搜索失效

    生产上Es根据一个时间字段搜索,却没有返回数据 根据命令: GET indexName/_mapping 查看 count_name设置了 “index”: false 导致根据该字段搜索导致索引不生效。 ES的mappings 定义好了生成索引后是不支持修改现有的字段的,只能新增属性。 使用 reindex 命令处理 1、运行命令: GET ind

    2024年02月11日
    浏览(35)
  • 更新了驱动导致电脑某个设备失效的解决方法

    一.问题描述        前端时间在联想管家中看到了更新驱动的提示,然后进去之后,点了其中的主板及芯片组的驱动更新,没想更新完成之后导致我的笔记本电脑中触摸板直接失灵,没有了鼠标,只有连接外部usb鼠标才有效。 二.分析原因       发现更新了驱动之后导致 

    2024年02月15日
    浏览(44)
  • Vue3使用Echarts导致tooltip失效

    版本 vue3.2.47 echarts5.4.1 使用响应式对象存储 echarts 实例,导致 tooltip 功能失效; 原因:Vue3 使用 proxy 对象代理,而 echarts 则使用了大量的全等(===), 对比失败从而导致了bug。 解决方法:将ref或reactive对象换成普通变量来保存 echarts 实例。 初始化图表 更新图表数据

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包