2013-11-02 23 views
12

Ich würde gerne wissen, wie man die Eigenschaften von einer Objektquelle zu einem Object-Ziel kopiert, NULL-Werte mit Spring Framework ignorierend.So ignorieren Sie Nullwerte mithilfe von SpringFramework BeanUtils copyProperties?

Ich benutze Apache Beanutils, mit diesem Code

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

es zu tun. Aber jetzt muss ich Spring benutzen.

Irgendwelche Hilfe?

Thx viel

+0

Können Sie nicht BeanUtils als Teil Ihres Frühling Projekt Klassenpfad enthalten? Ich glaube nicht, dass Spring's BeanUtils so funktionieren. –

Antwort

31

Sie können Ihre eigene Methode erstellen Eigenschaften zu kopieren, während Null-Werte zu ignorieren.

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)) 
} 
+0

Dies ist eine sehr gute Lösung dafür. Ich habe gehofft, dass der Rahmenplan bereits einen Weg vorgesehen hat, der sich darum kümmern wird, aber das wird perfekt funktionieren. danke – Fingolricks

+0

Ich habe das gleiche getan. Ich habe diese Methoden in eine neue Klasse mit einigen anderen benutzerdefinierten Implementierungen aufgenommen. Meine neue Klasse erweitert die BeanUtils-Klasse, sodass ich zusätzliche Funktionen und Funktionen hinzufügen kann. – yuva

+0

Es gibt einen Tippfehler im Call-Signal der myCopyProps-Methode ... zusätzliches Komma nach dem Objekt –

18

Java 8 Version von getNullPropertyNames Methode von alfredx des 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); 
} 
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. erstellen Java Bean,

    öffentliche Klasse HelloWorld {

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

    // Getter und Setter

  2. erstellen Hauptklasse

    public class App { public static void main (String [] args) testen { Application Kontext = 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); 
    } 
    

    }