utils property describe copyproperties beanutils bean java spring copy notnull

property - clone bean java



¿Cómo ignorar los valores nulos usando springframework BeanUtils copyProperties? (3)

SpringBeans.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="source" class="com.core.HelloWorld"> <property name="name" value="Source" /> <property name="gender" value="Male" /> </bean> <bean id="target" class="com.core.HelloWorld"> <property name="name" value="Target" /> </bean> </beans>

  1. Crea un Bean Java,

    clase pública HelloWorld {

    private String name; private String gender; public void printHello() { System.out.println("Spring 3 : Hello ! " + name + " -> gender -> " + gender); }

    // Getters y Setters

  2. Crear clase principal para probar

    aplicación de clase pública {public static void main (String [] args) {ApplicationContext context = new ClassPathXmlApplicationContext ("SpringBeans.xml");

    HelloWorld source = (HelloWorld) context.getBean("source"); HelloWorld target = (HelloWorld) context.getBean("target"); String[] nullPropertyNames = getNullPropertyNames(target); BeanUtils.copyProperties(target,source,nullPropertyNames); source.printHello(); } public static String[] getNullPropertyNames(Object source) { final BeanWrapper wrappedSource = new BeanWrapperImpl(source); return Stream.of(wrappedSource.getPropertyDescriptors()) .map(FeatureDescriptor::getName) .filter(propertyName -> wrappedSource.getPropertyValue(propertyName) == null) .toArray(String[]::new); }

    }

Me gustaría saber cómo copiar las propiedades de un origen de objeto a un objeto Dest ignorando valores nulos usando Spring Framework.

De hecho, uso beanutils Apache, con este código

beanUtils.setExcludeNulls(true); beanUtils.copyProperties(dest, source);

para hacerlo. Pero ahora necesito usar Spring.

¿Alguna ayuda?

Muchas gracias


Puede crear su propio método para copiar propiedades mientras ignora los valores nulos.

public static String[] getNullPropertyNames (Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set<String> emptyNames = new HashSet<String>(); for(java.beans.PropertyDescriptor pd : pds) { Object srcValue = src.getPropertyValue(pd.getName()); if (srcValue == null) emptyNames.add(pd.getName()); } String[] result = new String[emptyNames.size()]; return emptyNames.toArray(result); } // then use Spring BeanUtils to copy and ignore null public static void myCopyProperties(Object src, Object target) { BeanUtils.copyProperties(src, target, getNullPropertyNames(src)) }


Versión Java 8 del método getNullPropertyNames de la publicación de alfredx:

public static String[] getNullPropertyNames(Object source) { final BeanWrapper wrappedSource = new BeanWrapperImpl(source); return Stream.of(wrappedSource.getPropertyDescriptors()) .map(FeatureDescriptor::getName) .filter(propertyName -> wrappedSource.getPropertyValue(propertyName) == null) .toArray(String[]::new); }