2011-11-28 16 views
15

Ho notato che BeanUtils.copyProperties (dest, src) ha uno strano effetto collaterale. Tutto null Integers (probabilmente Long, Date ecc.) Convertire in 0 in entrambi gli oggetti: sorgente (sic!) E destinazione. Versione: Commons-beanutils-1.7.0BeanUtils.copyProperties converti Numero intero nullo a 0

javadoc:

valori proprietà Copia dall'origine fagiolo per il fagiolo di destinazione per tutti i casi in cui i nomi di proprietà sono gli stessi.

Ad esempio:

class User { 
    Integer age = null; 
    // getters & setters 
} 
... 
User userDest = new User(); 
User userSrc = new User(); 
BeanUtils.copyProperties(userDest, userSrc); 
System.out.println(userDest.getAge()); // 0 
System.out.println(userSrc.getAge()); // 0 

può essere molto buggy quell'oggetto sorgente viene effettivamente modificato. Qual è la soluzione migliore per rendere la copia "reale" dell'oggetto con valore null.

+0

Quale versione di beanUtils? Ho avuto alcuni problemi con obsoleto – Dewfy

+0

commons-beanutils-1.7.0, aggiunto al post – smas

risposta

14

Ok ho trovato this post

C'è però una grande differenza tra queste due classi che ho sono imbattuto durante l'utilizzo di queste classi: BeanUtils fa un tipo di conversione automatica e PropertyUtils non.

Ad esempio: con BeanUtils è possibile impostare una proprietà a doppio valore di fornendo una stringa. BeanUtils controllerà il tipo di proprietà e convertirà la stringa in una doppia. Con PropertyUtils hai sempre per fornire un oggetto valore dello stesso tipo della proprietà, quindi in questo esempio un doppio.

la conversione automatica non è necessario in questo caso, quindi meglio scelta è PropertyUtils classe

14

Il controllo http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html indica il valore predefinito per la conversione Integer è 0. Questo perché il tipo di destinazione qui è il primitivo int o il riferimento int e il primitivo int non possono essere impostati su null.

È possibile eseguire l'override del convertitore per Intero e sostituirlo con uno il cui valore predefinito è null.

UPDATE: L'uso è

import org.apache.commons.beanutils.converters.IntegerConverter; 

IntegerConverter converter = new IntegerConverter(null); 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
beanUtilsBean.getConvertUtils().register(converter, Integer.class); 

Date un'occhiata al codice sorgente per IntegerConverter - si imposta il valore di default nel costruttore.

+0

Suoni come spiegazione. Quindi quello che devo fare è sostituire/modificare questo Convertitore per restituire null - valore predefinito – smas

Problemi correlati