Una lógica típica, es copiar los atributos de un objeto a otro. Esto suele ser un trabajo tedioso y además se suele hacer a mano (a base de getters/setters).
Hay diferentes frameworks que realizan esta tarea de manera más o menos automática, y que facilitan muchísimo el trabajo. Dozer es uno de ellos y al tener más opciones de configuración es más potente, y por otro lado esta BeanUtils, que es más básico pero para casos simple, es más cómodo.
BeanUtils viene incluido en la librería de apache commons-beanutils. Con esta clase Singleton, si los atributos se llaman igual hará el paso de los atributos de un objeto a otro de forma automática. Eso si, es imprescindible que el objeto origen tenga sus getters y el de destino sus setters. Ejemplo básico:
BeanUtils.copyProperties(objetoDestino, objetoOrigen);
La librería commons-beanutils también tiene otra clase de utilidad llamada PropertyUtils. Las dos clases son muy parecidas, pero hay que tener en cuenta que mientras BeanUtils si realiza conversión de tipos de atributos, PropertyUtils no.
Si quieres hacer conversiones por defecto con BeanUtils, se pueden realizar con las distintas clases que implementan Converter. A través de ConverterUtils se pueden configurar estas clases de utilidad e indicar además que valor dar por defecto en la conversión si esta falla. Ejemplo:
//Ejemplo 1 IntegerConverter converter = new IntegerConverter(Integer.MIN_VALUE); BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); beanUtilsBean.getConvertUtils().register(converter, Integer.class); beanUtilsBean.copyProperties(objetoDestino, objetoOrigen); //Ejemplo 2 ConvertUtils.deregister(); //limpiamos la anterior configuracion ConvertUtils.register(converter, Integer.class); BeanUtils.copyProperties(objetoDestino, objetoOrigen);
Por último, puedes implementar tus propias clases Converter para realizar las conversiones a medida. Para ello tu clase debe implementar Converter y su método convert. Aquí añado un ejemplo para evitar los MIN_VALUE en las clases numéricas:
public class NumberMinConverter implements Converter { private static MapprimitiveMap = new HashMap (); static { primitiveMap.put(int.class, Integer.class); primitiveMap.put(long.class, Long.class); } public T convert(final Class clase, final Object value) { if (value == null) { return null; } else if (value instanceof Long && (Long) value == Long.MIN_VALUE) { return (T) devuelveRetorno(clase); } else if (value instanceof Integer && (Integer) value == Integer.MIN_VALUE) { return (T) devuelveRetorno(clase); } else { return (T) value; } } //devuelve null ó 0 en función del tipo de atributo a convertir (si es primitivo o no) private Object devuelveRetorno(final Class clase) { Object retorno = null; if (clase.isPrimitive()) { Class objectClass = primitiveMap.get(clase); Method valueOf = objectClass.getMethod("valueOf", clase); retorno = valueOf.invoke(null, 0); } return retorno; } }
Llamada:
ConvertUtils.register(new NumberMinConverter(), Long.TYPE); BeanUtils.copyProperties(objetoDestino, objetoOrigen);
No hay comentarios:
Publicar un comentario