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
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))
}
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);
}
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 et Setters
-
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); }
}