BeanUtils.copyProperties преобразува Integer null в 0

Забелязах, че BeanUtils.copyProperties(dest, src) има странен страничен ефект. Всички null 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

Може да бъде много бъгово, че изходният обект действително е модифициран. Кое е най-доброто решение да се направи "реално" копие на обект с нулева стойност.


person lukastymo    schedule 28.11.2011    source източник
comment
Коя версия на beanUtils? Имах проблеми с остарелите   -  person Dewfy    schedule 28.11.2011
comment
commons-beanutils-1.7.0, добавен към публикацията   -  person lukastymo    schedule 28.11.2011
comment
Така че, ако отменя конфигурацията за определена функция в клас, какво се случва с екземплярите на bean utils, използвани в различен клас. Замяната специфична за функцията ли е или за всички функции от този клас? Моля помогнете   -  person Ankush Kapoor    schedule 06.06.2018


Отговори (3)


Проверка на http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html показва, че стойността по подразбиране за преобразуване на Integer е 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 - задавате стойността по подразбиране в конструктора.

person Michael Wiles    schedule 28.11.2011
comment
Звучи като обяснение. Така че това, което трябва да направя, е да заменя/модифицирам този конвертор, за да върне null - стойност по подразбиране - person lukastymo; 28.11.2011

Добре, намерих тази публикация

Има обаче голяма разлика между тези два класа, на която се натъкнах, докато използвах тези класове: BeanUtils прави автоматично преобразуване на типа, а PropertyUtils не.

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

В този случай не е необходимо автоматично преобразуване, така че по-добрият избор е PropertyUtils клас

person lukastymo    schedule 28.11.2011

Използвам BeanUtils 1.8.3,
вместо да регистрирам IntegerConverter до Integer.class (и всеки друг клас един по един), както отговори Майкъл
можете да го направите веднъж завинаги както по-долу:

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

По този начин той никога не хвърля изключения и Default Null

person Maxwell Cheng    schedule 17.06.2021