ejemplo copyproperties beanutils java spring reflection javabeans

java - ejemplo - BeanUtils.copyProperties convierte Entero nulo en 0



java reflection ejemplo (2)

Noté que BeanUtils.copyProperties (dest, src) tiene un extraño efecto secundario. Todos los Integers nulos (probablemente Long , Date etc. también) se convierten a 0 en ambos objetos: source (sic!) Y destination. Versión: commons-beanutils-1.7.0

javadoc:

Copie valores de propiedad del bean de origen al bean de destino para todos los casos donde los nombres de las propiedades 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 problemático que el objeto fuente en realidad se modifique. ¿Cuál es la mejor solución para hacer una copia "real" de un objeto con valor nulo?


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 int o referencia prim y primitive int no se puede establecer 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);

Eche un vistazo al código fuente para IntegerConverter: establece el valor predeterminado en el constructor.


Ok, he encontrado esta publicación

Sin embargo, hay una gran diferencia entre estas dos clases que encontré al usar estas clases: BeanUtils realiza una conversión de tipo automática y PropertyUtils no.

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

La conversión automática no es necesaria en este caso, así que una mejor opción es la clase PropertyUtils