BeanUtils.copyProperties конвертировать Integer null в 0

Я заметил, что BeanUtils.copyProperties(dest, src) имеет странный побочный эффект. Все null Integers (возможно, Long, Date и т.д.) Конвертируют в 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

Это может быть очень плохо, если исходный объект фактически изменен. Какое наилучшее решение сделать "реальную" копию объекта с нулевым значением.

Ответы

Ответ 1

Хорошо, я нашел этот пост

Однако существует большая разница между этими двумя классами, которые я натолкнулся на использование этих классов: BeanUtils делает автоматический тип преобразования и PropertyUtils не делает.

Например: с помощью BeanUtils вы можете установить свойство с двойной оценкой на обеспечивая строку. BeanUtils проверит тип имущества и преобразуйте String в double. С PropertyUtils у вас всегда есть для предоставления объекта ценности того же типа, что и свойство, поэтому в этом пример двойной.

В этом случае автоматическое преобразование не требуется, поэтому лучший выбор PropertyUtils class

Ответ 2

Проверка http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html указывает, что значение по умолчанию для преобразования Целое равно 0. Это связано с тем, что здесь тип назначения - это примитивный int или reference 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 - вы устанавливаете значение по умолчанию в конструкторе.