BeanUtils.copyProperties将Integer null转换为0

时间:2011-11-28 12:35:36

标签: java spring reflection javabeans

我注意到BeanUtils.copyProperties(dest,src)有一个奇怪的副作用。所有null Integers(可能LongDate等)在两个对象中都转换为0:source(sic!)和destination。版本:commons-beanutils-1.7.0

的Javadoc:

  

将属性值从原始bean复制到目标bean   所有属性名称相同的情况。

例如:

class User {
   Integer age = null;
   // getters & setters
}
...
User userDest = new User();
User userSrc = new User();
BeanUtils.copyProperties(userDest, userSrc);
System.out.println(userDest.getAge()); // 0
System.out.println(userSrc.getAge()); // 0

实际修改源对象可能非常麻烦。制作"真实"的最佳解决方案是什么?具有空值的对象的副本。

3 个答案:

答案 0 :(得分:16)

检查http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html它表示整数转换的默认值为0.这是因为这里的目标类型是原始int或引用int而原始int不能设置为null。

您可以覆盖Integer的转换器,并将其替换为默认值为null的转换器。

更新:用法是

import org.apache.commons.beanutils.converters.IntegerConverter;

IntegerConverter converter = new IntegerConverter(null); 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
beanUtilsBean.getConvertUtils().register(converter, Integer.class);

查看IntegerConverter的源代码 - 在构造函数中设置默认值。

答案 1 :(得分:16)

好的,我找到了this post

  

然而,我和这两个班级之间存在很大差异   在使用这些类时遇到了:BeanUtils自动执行   类型转换和PropertyUtils没有。

     

例如:使用BeanUtils,您可以设置双值属性   提供一个字符串。 BeanUtils将检查属性的类型和   将String转换为double。使用PropertyUtils,你总是有   提供与属性相同类型的值对象,所以在此   例如一个双。

在这种情况下不需要自动转换,因此更好的选择是PropertyUtils class

答案 2 :(得分:0)

我使用的是 BeanUtils 1.8.3,
而不是按照迈克尔的回答将 IntegerConverter 注册到 Integer.class(以及任何其他课程)
你可以像下面这样一劳永逸地完成:

boolean throwException=false;
boolean defaultNull=true;
int defaultArraySize=0;
BeanUtilsBean.getInstance().getConvertUtils().register(throwException,  defaultNull, defaultArraySize);

这样就不会抛出异常,并且默认为空