2010-04-08 9 views
12

Korzystanie z Commons beanUtils Chciałbym wiedzieć, jak poprosić dowolnego konwertera, aby Dateconverter ignorował wartości puste i używał wartości domyślnej null. Jako przykład rozważmy publiczną klasę,Jak poprosić BeanUtils o zignorowanie wartości pustych

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

i moją convertertest jak

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()); 
    } 
} 

Powyższy rzuca NPE od daty zdarza się być null. Wygląda to dla mnie bardzo prymitywnym scenariuszem, który powinien być obsługiwany domyślnie (jak na przykład, oczekiwałbym, że x2 będzie mieć wartość null dla date1). Dokument mówi mi, że mogę poprosić o to converter. Czy ktoś może mi wskazać najlepszy sposób na zrobienie tego?

Nie chcę, aby konwerter i isUseDefault() były prawdziwe, ponieważ wtedy muszę to zrobić dla wszystkich dat, enum i wielu innych konwerterów!

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/ konwertery/DateConverter.html Twój link jest zepsuty – VedX

Odpowiedz

33

Widocznie to wygląda, nie ma sposobu, aby powiedzieć ConvertUtils aby nie rzucać wyjątki na wartości null, które uzyskuje się poprzez wywołanie

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

Aby wyjaśnić, powinieneś uruchomić tę linię, zanim uruchomisz metodę copyProperties. –

1

Niedawno wpadłem na ten problem i właśnie przekonwertowałem zmienną na ciąg znaków, aby uniknąć tego błędu i przekonwertowałem go z powrotem na datę, kiedy jest to konieczne. Nie jest to najbardziej eleganckie rozwiązanie, ale dla uproszczenia i uniknięcia takich problemów, jest to opłacalne rozwiązanie. Innym zastrzeżeniem było to, że BeanUtils uruchomiłby swoje metody zanim moje klasy się załadują, więc zdecydowałem się na to, zamiast na bardziej skomplikowanym rozwiązaniu problemu, używając niestandardowych programów ładujących klasy.

Nawiasem mówiąc, przed wersją 1.8.0, sama BeanUtils zignorowałaby te wartości puste.

Zobacz ten link: No value specified for 'Date' when the field is a java.util.Date with a null value w celu uzyskania szczegółowego wyjaśnienia.

10

Najlepszym rozwiązaniem jest aktualizacja do BeanUtils 1.9.0, ponieważ ten problem został rozwiązany jak widać tutaj https://issues.apache.org/jira/browse/BEANUTILS-454

+4

Ten problem występuje dla mnie, a ja jestem w wersji 1.9.2 z commons-beanutils. – Marc

+0

Używałem wersji 1.9.2 i obniżyłem ją do 1.9.0 dla mojego projektu. Problem nie został rozwiązany. –

+1

Świetnie! Rozwiązuje mój problem. –

0

Jestem nieco zdziwiony, że taka prosta sprawa, jak ustawienie wartości null w fasoli, tak :

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

powoduje awarię działania, jak opisano powyżej.

Na co warto, tu jest mój obejście:

import org.apache.commons.beanutils.BeanMap; 

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