2013-11-02 15 views
12

Chciałbym wiedzieć, jak skopiować właściwości ze źródła obiektu do obiektu Dest ignorowanie wartości null przy użyciu Spring Framework.Jak ignorować wartości puste przy użyciu springframework BeanUtils copyProperties?

I faktycznie korzysta beanutils Apache, z tym kodem

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

to zrobić. Ale teraz muszę użyć Springa.

Każda pomoc?

Thx dużo

+0

Czy nie obejmują BeanUtils jako część swojej wiosennej klasy projekt ścieżki? Nie sądzę, żeby Spring's BeanUtils działały w ten sposób. –

Odpowiedz

31

Można utworzyć własną metodę, aby skopiować właściwości ignorując wartości 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)) 
} 
+0

To bardzo dobre rozwiązanie. Miałem nadzieję, że ramy już zaplanowały sposób, który się tym zajmie, ale to zadziała doskonale. dzięki – Fingolricks

+0

Zrobiłem to samo. Uwzględniłem te metody w nowej klasie z innymi niestandardowymi implementacjami. Moja nowa klasa rozszerza klasę BeanUtils, dzięki czemu mogę dodawać dodatkowe funkcje i funkcje. – yuva

+0

W wywołaniu sig metody myCopyProps występuje literówka ... dodatkowy przecinek po obiekcie –

18

Java 8 wersja metody getNullPropertyNames z alfredx na 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. Tworzenie Java Bean,

    klasa publiczna HelloWorld {

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

    // pobierające i ustawiające

  2. Tworzenie klasy Main przetestować

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

    }

Powiązane problemy