Ответ 1
По-видимому, похоже, есть способ сообщить ConvertUtils не генерировать исключения по нулевым значениям, которые достигаются при вызове
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
Использование 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 и многих других преобразователей!
По-видимому, похоже, есть способ сообщить ConvertUtils не генерировать исключения по нулевым значениям, которые достигаются при вызове
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
Лучшим решением является обновление до BeanUtils 1.9.0, так как эта проблема исправлена, как вы можете видеть здесь https://issues.apache.org/jira/browse/BEANUTILS-454
Возможно, немного поздно, но выглядит, что вы можете зарегистрировать DateConverter https://issues.apache.org/jira/browse/BEANUTILS-387
Недавно я столкнулся с этой проблемой и просто преобразовал мою переменную в строку, чтобы избежать этой ошибки и преобразовал ее обратно в дату, когда это необходимо. Не самое изящное решение, но для простоты и избежания подобных проблем это жизнеспособное решение. Другое предостережение заключалось в том, что BeanUtils будет отключать его методы до загрузки моих классов, поэтому я решил использовать это, а не более сложное решение проблемы с помощью пользовательских загрузчиков классов.
Кстати, до версии 1.8.0, BeanUtils сам проигнорировал бы эти нулевые значения.
Смотрите эту ссылку: Нет значения, указанного для "Дата" , когда поле представляет собой java.util.Date с нулевым значением для подробного объяснения.
Я несколько удивлен, что такой простой случай, как установка нулевого значения в 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);