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、解决方案
解决方法有两种:
- 升级 commons-beanutils
- 使用 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包冲突导致的。
本文暂时没有评论,来添加一个吧(●'◡'●)