程序员开发实例大全宝库

网站首页 > 编程文章 正文

惊~ BeanUtils生产竟然莫名异常了

zazugpt 2024-08-25 17:32:26 编程文章 15 ℃ 0 评论

1、背景介绍

在线新老表数据同步的时候,接口之间使用DTO进行数据传递。然后使用 BeanUtils.copyProperties 进行对象属性的赋值。

BeanUtils使用的是 commons-beanutils工具。

2、线上异常

在测试环境进行功能测试,功能正常。发布到生产之后,执行数据同步发生异常:

java.lang.RuntimeException: org.apache.commons.beanutils.ConversionException: No value specified for 'Date'
at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:310)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:136)
at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
at org.apache.commons.beanutils.BeanUtilsBean.convert(BeanUtilsBean.java:1074)
at org.apache.commons.beanutils.BeanUtilsBean.copyProperty(BeanUtilsBean.java:437)
at org.apache.commons.beanutils.BeanUtilsBean.copyProperties(BeanUtilsBean.java:286)
at org.apache.commons.beanutils.BeanUtils.copyProperties(BeanUtils.java:137)

3、问题排查

在commons-beanutils的1.8版本的时候,会对对象的null进行校验。

在Stack Overflow上有相关的问题描述:https://stackoverflow.com/questions/2601175/how-to-ask-beanutils-to-ignore-null-values



4、解决方案

解决方法有两种:

  1. 升级 commons-beanutils
  2. 使用 Spring beanutils 替换

尝试第一种方法,失败。原因是显示使用的commons-beanutils是通过 commons-beanutils-core 引入的。


通过对比代码发现,commons-beanutils:1.9.3和 commons-beanutils-core:1.8.0还是有很大区别的:




所以直接升级的方式,在当前的项目中就不太适用了。

最终选择了使用Spring提供的beanutils。

需要注意的是:spring beanutils和commons beanutils的参数的顺序是反着的。

5、总结

在实际项目中,还是要遵守一定的代码规范,尤其是Maven依赖的使用。很多线上的莫名问题都是因为jar包冲突导致的。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表