BeanUtils.copyProperties конвертировать целое число ноль в 0 - PullRequest
15 голосов
/ 28 ноября 2011

Я заметил, что BeanUtils.copyProperties (dest, src) имеет странный побочный эффект. Все null Integers (возможно, Long, Date и т. Д. Тоже) преобразуются в 0 в обоих объектах: источник (sic!) И место назначения. Версия: commons-beanutils-1.7.0

Javadoc:

Скопировать значения свойств из исходного объекта в целевой компонент для все случаи, когда имена свойств совпадают.

Например:

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

Может быть очень ошибочно, что исходный объект действительно изменен. Как лучше всего сделать «настоящую» копию объекта с нулевым значением?

Ответы [ 2 ]

16 голосов
/ 28 ноября 2011

Хорошо, я нашел это сообщение

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

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

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

16 голосов
/ 28 ноября 2011

Проверка http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html указывает, что по умолчанию для целочисленного преобразования установлено значение 0. Это потому, что типом назначения здесь является примитив int или ссылка int, а примитив int не может быть установлен равным нулю.

Вы можете переопределить конвертер для Integer и заменить его на тот, чье значение по умолчанию равно нулю.

ОБНОВЛЕНИЕ: использование

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

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

Взгляните на исходный код IntegerConverter - вы устанавливаете значение по умолчанию в конструкторе.

...