web-dev-qa-db-fra.com

Comment ignorer les valeurs NULL en utilisant springFramework BeanUtils copyProperties?

J'aimerais savoir comment copier les propriétés d'une source d'objet vers un objet, en ignorant les valeurs null à l'aide de Spring Framework.

J'utilise réellement 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

17
Fingolricks

Vous pouvez créer votre propre méthode pour copier les propriétés tout en ignorant les valeurs NULL.

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))
}
42
Alfred Xiao

Version Java 8 de la méthode getNullPropertyNames à partir de 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);
}
25
Paweł Kaczorowski

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 and Setters
    }
    
  2. Créer une classe principale à tester

    public class App {
        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
Kumar Abhishek

Je vous conseille d'utiliser ModelMapper.

Ceci est un exemple de code qui résout votre doute.

      ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setSkipNullEnabled(true).setMatchingStrategy(MatchingStrategies.STRICT);

      Company a = new Company();
      a.setId(123l);
      Company b = new Company();
      b.setId(456l);
      b.setName("ABC");

      modelMapper.map(a, b);

      System.out.println("->" + b.getName());

Il convient d’imprimer la valeur B. Mais si vous définissez le nom "A", le résultat est une impression de la valeur "A".

Le secret change la valeur de SkipNullEnabled en true.

ModelMapper

ModelMapper MVN

0
bpedroso