2011-11-28 5 views
15

में परिवर्तित करें मैंने देखा कि BeanUtils.copyProperties (dest, src) का एक अजीब साइड इफेक्ट है। सभी शून्य Integers (शायद Long, Date आदि) दोनों वस्तुओं में 0 में परिवर्तित: स्रोत (एसआईसी!) और गंतव्य। संस्करण: कॉमन्स-beanutils-1.7.0BeanUtils.copyProperties इंटीजर नल को 0

जावाडोक: सभी मामलों में जहां संपत्ति नाम समान हैं के लिए गंतव्य सेम करने के लिए मूल सेम से

कॉपी संपत्ति मूल्यों।

उदाहरण के लिए:

class User { 
    Integer age = null; 
    // getters & setters 
} 
... 
User userDest = new User(); 
User userSrc = new User(); 
BeanUtils.copyProperties(userDest, userSrc); 
System.out.println(userDest.getAge()); // 0 
System.out.println(userSrc.getAge()); // 0 

यह बहुत है कि स्रोत वस्तु वास्तव में संशोधित किया गया है छोटी गाड़ी जा सकता है। शून्य मूल्य के साथ वस्तु की "वास्तविक" प्रतिलिपि बनाने का सबसे अच्छा समाधान क्या है।

+0

कौन सा beanUtils का संस्करण है? मुझे अप्रचलित – Dewfy

+0

कॉमन्स-बीन्यूटिल्स-1.7.0 के साथ कुछ समस्याएं थीं, – smas

उत्तर

14

ठीक है मैं मिल गया है this post

हालांकि इन दो वर्गों इन कक्षाओं का उपयोग करते समय जो मैं में आए बीच एक बड़ा अंतर नहीं है: BeanUtils एक स्वत: जैसे रूपांतरण करता है और PropertyUtils नहीं है।

उदाहरण के लिए: बीनयूट्स के साथ आप स्ट्रिंग प्रदान करके एक डबल मूल्यवान संपत्ति सेट कर सकते हैं। BeanUtils संपत्ति के प्रकार की जांच करेगा और स्ट्रिंग को एक डबल में परिवर्तित करेगा। प्रॉपर्टी के साथ आपके पास हमेशा है जो संपत्ति के समान प्रकार के मूल्य वस्तु प्रदान करने के लिए है, इसलिए इस उदाहरण में एक डबल।

स्वत: रूपांतरण इस मामले में आवश्यक नहीं है, इसलिए बेहतर विकल्प PropertyUtils वर्ग

14

http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html की जांच करना यह इंगित करता है कि इंटीजर रूपांतरण के लिए डिफ़ॉल्ट 0 है। ऐसा इसलिए है क्योंकि यहां गंतव्य प्रकार आदिम int या संदर्भ int है और आदिम int को शून्य पर सेट नहीं किया जा सकता है।

आप इंटीजर के लिए कनवर्टर ओवरराइड कर सकते हैं और इसे एक के साथ प्रतिस्थापित कर सकते हैं जिसका डिफ़ॉल्ट मान शून्य है।

अद्यतन: उपयोग

import org.apache.commons.beanutils.converters.IntegerConverter; 

IntegerConverter converter = new IntegerConverter(null); 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
beanUtilsBean.getConvertUtils().register(converter, Integer.class); 

IntegerConverter के लिए स्रोत कोड पर एक नजर डालें है - आप निर्माता में डिफ़ॉल्ट मान सेट करें।

+0

पोस्ट में स्पष्टीकरण की तरह लगता है। तो मुझे यह करने की ज़रूरत है कि इस कन्वर्टर को नल - डिफ़ॉल्ट मान वापस करने के लिए बदलें/संशोधित करें – smas

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

  • कोई संबंधित समस्या नहीं^_^