Comment ignorer les valeurs nulles en utilisant springfram Framework BeanUtils copyProperties?

je voudrais savoir comment copier les propriétés d'un objet Source vers un objet Dest ignorant les valeurs nulles en utilisant Spring Framework.

j'utilise en fait Apache beanutils, avec ce code

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

pour le faire. Mais maintenant je dois utiliser le printemps.

de l'aide?

Merci beaucoup

15
demandé sur Cœur 2013-11-02 04:34:15

3 réponses

vous pouvez créer votre propre méthode pour copier des propriétés tout en ignorant les valeurs nulles.

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))
}
40
répondu Alfred Xiao 2016-11-05 20:52:18

version Java 8 de la méthode getNullPropertyNames de alfredx post :

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);
}
21
répondu Paweł Kaczorowski 2017-05-23 11:46:55

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. Créer un Bean java,

    public class HelloWorld {

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

    //Getters et Setters

  2. créer la classe principale pour tester

    public class Application { 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);
    }
    

    }

4
répondu Kumar Abhishek 2016-02-23 14:06:24