BeanUtils.copyProperties将Integer null转换为0



我注意到BeanUtils。copyProperties(dest, src)有一个奇怪的副作用。所有空Integers(可能是Long, Date等)在两个对象中转换为0:源(sic!)和目标。版本: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

源对象实际上被修改了,这可能是非常有bug的。什么是最好的解决方案,使"真实"的对象与空值的副本。

我找到了这篇文章

然而,这两个类之间有一个很大的区别在使用这些类时遇到的问题:BeanUtils会自动执行类型转换和PropertyUtils没有。

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

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

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

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

UPDATE: Usage is

import org.apache.commons.beanutils.converters.IntegerConverter;
IntegerConverter converter = new IntegerConverter(null); 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
beanUtilsBean.getConvertUtils().register(converter, Integer.class);

看一下IntegerConverter的源代码——你在构造函数中设置了默认值。

我使用的是BeanUtils 1.8.3,
而不是将IntegerConverter注册到Integer.class(以及任何其他类一个接一个),正如Michael所回答的那样
你可以像下面这样做:

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

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

相关内容

  • 没有找到相关文章

最新更新