2011-11-28 11 views
15

Me di cuenta de que BeanUtils.copyProperties (dest, src) tiene un extraño efecto secundario. Todos nulos Integers (probablemente Long, Date etc.) se convierten a 0 en ambos objetos: fuente (sic!) Y destino. Versión: bienes comunes BeanUtils-1.7.0BeanUtils.copyProperties convertir Entero nulo en 0

javadoc:

valores de las propiedades de copia desde el grano de origen hasta el destino frijol para todos los casos en que los nombres de propiedad son los mismos.

Por ejemplo:

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 

Puede ser muy Buggy que objeto de origen realmente se haya modificado. ¿Cuál es la mejor solución para hacer una copia "real" de un objeto con valor nulo?

+0

¿Qué versión de BeanUtils? Tuve algunos problemas con obsoleto – Dewfy

+0

commons-beanutils-1.7.0, agregado al post – smas

Respuesta

14

Ok he encontrado this post

Sin embargo, existe una gran diferencia entre estas dos clases que me encontré con durante el uso de estas clases: BeanUtils hace una conversión automática tipo y PropertyUtils no.

Por ejemplo: con BeanUtils puede establecer una propiedad de doble valor por que proporciona una Cadena. BeanUtils verificará el tipo de propiedad y convertirá el String en un doble. Con PropertyUtils siempre tiene para proporcionar un objeto de valor del mismo tipo que la propiedad, por lo que en este ejemplo es un doble.

conversión automática no es necesario en este caso, por lo que la mejor opción es PropertyUtils clase

14

Comprobando http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html indica que el valor predeterminado para la conversión de enteros es 0. Esto se debe a que el tipo de destino aquí es la primitiva int o referencia int y la primitiva int no puede establecerse en nulo.

Puede anular el convertidor para Entero y reemplazarlo por uno cuyo valor predeterminado sea nulo.

ACTUALIZACIÓN: El uso es

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

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

Tome un vistazo al código fuente para IntegerConverter - se establece el valor predeterminado en el constructor.

+0

Suena como una explicación. Entonces, lo que tengo que hacer es reemplazar/modificar este convertidor para devolver nulo - valor predeterminado – smas