2013-11-02 7 views
12

मैं जानना चाहता हूं कि स्प्रिंग फ्रेमवर्क का उपयोग करके शून्य मानों को अनदेखा करते हुए किसी ऑब्जेक्ट स्रोत से किसी ऑब्जेक्ट को गुणों को कॉपी करने के लिए कैसे करें।वसंतफ्रेमवर्क का उपयोग कर शून्य मूल्यों को कैसे अनदेखा करें BeanUtils copyProperties?

मैं वास्तव में, अपाचे beanutils का उपयोग इस कोड

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

साथ यह करने के लिए। लेकिन अब मुझे वसंत का उपयोग करने की जरूरत है।

कोई मदद?

Thx एक बहुत

+0

आप अपने स्प्रिंग परियोजना वर्ग पथ के भाग के रूप BeanUtils शामिल नहीं कर सकते हैं? मुझे नहीं लगता कि वसंत के बीन इस तरह से काम करते हैं। –

उत्तर

31

आप शून्य मान को अनदेखा करते हुए गुण कॉपी करने के लिए अपनी खुद की विधि बना सकते हैं।

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

यह इसके लिए एक बहुत अच्छा समाधान है। मुझे उम्मीद थी कि फ्रेमवर्क पहले से ही एक तरीका तय कर चुका है जो इसका ख्याल रखेगा, लेकिन यह पूरी तरह से काम करेगा। धन्यवाद – Fingolricks

+0

मैंने वही किया। मैंने कुछ अन्य कस्टम कार्यान्वयन के साथ इन तरीकों को एक नई कक्षा में शामिल किया। मेरी नई कक्षा बीनयूटिल कक्षा को विस्तारित करती है ताकि मैं अतिरिक्त सुविधाओं और कार्यक्षमताओं को जोड़ सकूं। – yuva

+0

MyCopyProps विधि के कॉल सिग में टाइपो है ... ऑब्जेक्ट –

18

जावा 8 alfredx के post से getNullPropertyNames विधि के संस्करण:

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. एक जावा बीन,

    बनाएं

    सार्वजनिक वर्ग हैलोवर्ल्ड {

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

    // getters और setters

  2. मुख्य क्लास

    सार्वजनिक वर्ग अनुप्रयोग { public static void (String [] args) { ApplicationContext संदर्भ = नए 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); 
    } 
    

    }

संबंधित मुद्दे

 संबंधित मुद्दे