tutorial started springboot guide getting framework java spring spring-mvc apache-commons

java - started - spring framework tutorial



Copie campos específicos usando BeanUtils.copyProperties? (5)

springframework.beans.BeanUtils es muy útil para copiar objetos, y uso la opción "ignoreProperties" frecuentemente. Sin embargo, a veces quiero copiar solo objetos específicos (básicamente, lo opuesto a "ignorar propiedades"). ¿Alguien sabe cómo puedo hacer eso? Cualquier ayuda será apreciada.

import org.springframework.beans.BeanUtils; public class Sample { public static void main(String[] args) { DemoADto demoADto = new DemoADto(); demoADto.setName("Name of Demo A"); demoADto.setAddress("Address of Demo A"); DemoBDto demoBDto = new DemoBDto(); // This is "ignoreProperties" option // But I want to know how I can copy only name field by using BeanUtils or something. BeanUtils.copyProperties(demoADto, demoBDto, new String[] {"address"}); System.out.println(demoBDto.getName()); System.out.println(demoBDto.getAddress()); } } public class DemoADto { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } public class DemoBDto { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }


Aquí hay un ejemplo con la clase Spring BeanUtils:

public static void copyList(List sourceList, List targetList, Class targetType) { try { for (Object source : sourceList) { Object target = null; target = targetType.newInstance(); BeanUtils.copyProperties(source, target); targetList.add(target); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }


Mira esto: BeanPropertyCopyUtil .

Ejemplo:

copyProperties(user, systemUser, "first firstName", "last lastName");

También necesitarás Apache Commons BeanUtils.


Puede usar la tecnología BeanWrapper . Aquí hay una implementación de muestra:

public static void copyProperties(Object src, Object trg, Iterable<String> props) { BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(src); BeanWrapper trgWrap = PropertyAccessorFactory.forBeanPropertyAccess(trg); props.forEach(p -> trgWrap.setPropertyValue(p, srcWrap.getPropertyValue(p))); }

O bien, si realmente quieres usar BeanUtils , aquí hay una solución. Invierte la lógica, reúne excluye al comparar la lista de propiedades completa con las incluye:

public static void copyProperties2(Object src, Object trg, Set<String> props) { String[] excludedProperties = Arrays.stream(BeanUtils.getPropertyDescriptors(src.getClass())) .map(PropertyDescriptor::getName) .filter(name -> !props.contains(name)) .toArray(String[]::new); BeanUtils.copyProperties(src, trg, excludedProperties); }


Puede usar org.springframework.beans.BeanUtils.copyProperties (Origen del objeto, Objetivo del objeto, Clase editable) throws BeansException

Asegúrese de que el objetivo implemente la interfaz editable que define las propiedades que se copiarían.


Si no quiere usar Commons BeanUtils, puede usar Spring utilizando BeanWrapper .

Tendrás que recorrer manualmente todas las propiedades, por lo que querrás hacer un método de ayuda estático.

Siempre puede copiar lo que copyProperties está haciendo y ajustarlo a su gusto: http://tinyurl.com/BeanUtils-copyProperties