2010-04-08 10 views
12

Uso di Commons beanUtils Vorrei sapere come chiedere a qualsiasi convertitore di dire al Dateconverter di ignorare i valori nulli e utilizzare null come predefinito. A titolo di esempio si consideri una classe pubblica,Come chiedere a BeanUtils di ignorare i valori nulli

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

e la mia convertertest come,

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

È possibile che questo getta un NPE a partire dalla data sembra essere nulla. Questo mi sembra uno scenario molto primitivo che dovrebbe essere gestito di default (come in, mi aspetto che x2 abbia valore nullo per data1). Il documento mi dice che posso chiedere allo converter di farlo. Qualcuno può indicarmi il modo migliore per farlo?

Non voglio entrare in possesso del convertitore e isUseDefault() è vero perché allora devo farlo per tutti Data, Enum e molti altri convertitori!

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/ converters/DateConverter.html il tuo link è rotto – VedX

risposta

33

Apparentemente sembra, c'è un modo per dire ai ConvertUtils di non generare eccezioni sui valori nulli che si ottiene chiamando

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

Per chiarire, devi eseguire questa linea prima di eseguire il metodo copyProperties. –

1

Recentemente mi sono imbattuto in questo problema e ho appena convertito la mia variabile in una stringa per evitare questo errore e convertirla in una data quando necessario. Non è la soluzione più elegante, ma per semplicità e per evitare problemi come questo, è una soluzione praticabile. L'altra avvertenza era che BeanUtils avrebbe sparato dai suoi metodi prima che le mie classi si caricassero, quindi ho optato per questa soluzione piuttosto complicata usando i caricatori di classi personalizzati.

A proposito, prima di verion 1.8.0, BeanUtils stesso ignorerebbe questi valori nulli.

Vedere questo collegamento: No value specified for 'Date' when the field is a java.util.Date with a null value per una spiegazione dettagliata.

10

La soluzione migliore è l'aggiornamento a 1.9.0 BeanUtils, dal momento che questo problema è stato risolto, come potete vedere qui https://issues.apache.org/jira/browse/BEANUTILS-454

+4

Questo problema si verifica per me e sono nella versione 1.9.2 di commons-beanutils. – Marc

+0

Stavo usando la versione 1.9.2 e la downgrade alla versione 1.9.0 per il mio progetto. Il problema non è stato risolto. –

+1

Ottimo! Risolve il mio problema. –

0

Sono un po 'stupito che un caso come semplice quanto l'impostazione di un valore nullo in un fagiolo, come questo :

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

causa comportamento anomalo, come descritto sopra.

Per quello che vale, ecco la mia soluzione:

import org.apache.commons.beanutils.BeanMap; 

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