Как попросить BeanUtils игнорировать нулевые значения - PullRequest
13 голосов
/ 08 апреля 2010

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

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

и мой конвертер-тест как,

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, так как дата оказывается нулевой. Для меня это выглядит очень примитивным сценарием, который должен обрабатываться по умолчанию (например, я ожидаю, что x2 будет иметь нулевое значение для date1). Доко говорит мне, что я могу попросить конвертер сделать это. Может кто-нибудь указать мне, как лучше всего это сделать?

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

Ответы [ 5 ]

38 голосов
/ 08 апреля 2010

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

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
10 голосов
/ 18 мая 2014

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

2 голосов
/ 27 апреля 2012

Возможно, немного поздно, но похоже, что вы можете зарегистрировать DateConverter https://issues.apache.org/jira/browse/BEANUTILS-387

1 голос
/ 24 февраля 2014

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

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

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

0 голосов
/ 12 мая 2015

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

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);
...