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
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))
}
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);
}
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>
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
}
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);
}
}
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.