Подтвердить что ты не робот

Как попросить BeanUtils игнорировать нулевые значения

Использование Commons beanUtils Я хотел бы знать, как спросить какой-либо конвертер сказать Dateconverter игнорировать нулевые значения и использовать null по умолчанию. В качестве примера рассмотрим открытый класс,

public class X {
    private Date date1;
    private String string1;
    //add public getters and setters
}

и мой convertertest как,

public class Apache {

    @Test
    public void testSimple() throws Exception {
        X x1 = new X(), x2 = new X();
        x1.setString1("X");
        x1.setDate1(null);
        org.apache.commons.beanutils.BeanUtils.copyProperties(x2, x1);
        //throws ConversionException
        System.out.println(x2.getString1());
        System.out.println(x2.getDate1());
    }
}

Вышеуказанный код вызывает NPE, так как дата имеет значение null. Это выглядит очень примитивным сценарием для меня, который должен обрабатываться по умолчанию (как и в, я ожидал бы, что x2 будет иметь значение null для date1). Doco говорит мне, что я могу попросить converter сделать это. Может ли кто-нибудь указать мне на лучший способ сделать это?

Я не хочу, чтобы получить конвертер и isUseDefault(), чтобы быть правдой, потому что тогда я должен сделать это для всех Date, Enum и многих других преобразователей!

4b9b3361

Ответ 1

По-видимому, похоже, есть способ сообщить ConvertUtils не генерировать исключения по нулевым значениям, которые достигаются при вызове

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);

Ответ 2

Лучшим решением является обновление до BeanUtils 1.9.0, так как эта проблема исправлена, как вы можете видеть здесь https://issues.apache.org/jira/browse/BEANUTILS-454

Ответ 4

Недавно я столкнулся с этой проблемой и просто преобразовал мою переменную в строку, чтобы избежать этой ошибки и преобразовал ее обратно в дату, когда это необходимо. Не самое изящное решение, но для простоты и избежания подобных проблем это жизнеспособное решение. Другое предостережение заключалось в том, что BeanUtils будет отключать его методы до загрузки моих классов, поэтому я решил использовать это, а не более сложное решение проблемы с помощью пользовательских загрузчиков классов.

Кстати, до версии 1.8.0, BeanUtils сам проигнорировал бы эти нулевые значения.

Смотрите эту ссылку: Нет значения, указанного для "Дата" , когда поле представляет собой java.util.Date с нулевым значением для подробного объяснения.

Ответ 5

Я несколько удивлен, что такой простой случай, как установка нулевого значения в bean, вот так:

BeanUtils.setProperty(pojo, "date", null);

вызывает сбой, как описано выше.

Для чего это стоит, вот мое обходное решение:

import org.apache.commons.beanutils.BeanMap;

BeanMap beanMap = new BeanMap(pojo);
Method writeMethod = beanMap.getWriteMethod("date");
writeMethod.invoke(pojo, null);