2011-10-04 11 views
5

मैं गैर जीडब्ल्यूटी-आरपीसी जावा आधारित वेब सेवा से आने वाले JSON डेटा को मैप करने के लिए ऑटोबीन का उपयोग कर रहा हूं। सब कुछ एक मैपिंग को छोड़कर अब तक काम कर रहा है।क्या एक जीडब्ल्यूटी ऑटोबीन को कम करने का कोई तरीका है?

सर्वर की तरफ, कक्षा में टाइप मैप की एक संपत्ति है जहां MyAbstractParentObject लगभग 15 अलग-अलग बाल वर्गों का मूल वर्ग है।

जब मैं क्लाइंट पर संबंधित ऑटोबीन इंटरफ़ेस पर मैप करता हूं तो मैं अपने बच्चे के प्रकार को डीकोड किए जाने के बाद MyAbstractParentObject को कम करने में सक्षम नहीं हूं। मैंने सभी जीडब्ल्यूटी डॉक्स और 'द गुगल' को देखा ताकि यह देखने के लिए कि ऑटोबीन में भी पॉलिमॉर्फिक समर्थन है लेकिन किसी भी तरह का जवाब नहीं मिल सका। इंटरसेप्टर और श्रेणियां इस संभाल में सक्षम नहीं लगती हैं, बस उन तरीकों से वे इंटरफ़ेस में मौजूद होना चाहते हैं जो गेटर्स/सेटर्स नहीं हैं।

मैं जेएसओएन डेटा में टाइप फील्ड का उपयोग करके बाल वर्ग का उदाहरण बनाने के लिए एक वर्कअराउंड करने का प्रयास कर रहा था लेकिन ऑटोबीन मुझे कच्चे JSON तक पहुंच नहीं देता है, भले ही डीबगर में मैं इसे देख सकूं 'डेटा' नामक एक संरक्षित क्षेत्र। यदि मैं मूल बीन को डीकोड करने का प्रयास करता हूं तो इसमें केवल MyAbstractParentObject में फ़ील्ड होंगे।

  1. बढ़ाएँ या अपने खुद के AutoBeanCodex कि ठीक से MyAbstractParentObject की बच्चों संभाल कर सकते हैं जब यह JSON डीकोड बनाएँ:

    केवल विकल्पों मैं देख सकता हूँ करने के लिए कर रहे हैं।

  2. MyAbstractParentObject ऑटोबीन में कच्चे JSON तक पहुंचने का एक तरीका खोजें और फ्लाई पर बाल वर्ग बनाने और उसका उपयोग करने के लिए इसका उपयोग करें।
  3. GWTProJSONSerializer या piriti जैसे कुछ अन्य JSON-GWT Serialization ढांचे पर स्विच करें।

किसी भी मदद की सराहना की जाएगी।

उत्तर

4

मैं इस एक लंबे समय पहले कहा गया था पता है, लेकिन मैं भी एक जवाब खोजने के लिए संघर्ष किया। मुझे एहसास हुआ कि ऑटोबीन्स, क्योंकि वे मूल रूप से जेएसओएन के लिए केवल फैंसी रैपर हैं, फिर भी उस बच्चे ऑब्जेक्ट के उन सभी फ़ील्ड के लिए सभी डेटा शामिल हैं जिन्हें आप कम करना चाहते हैं।

public <A, B> B cast(A sourceObject, Class<B> targetClass) 
{ 
    AutoBean<A> sourceBean = AutoBeanUtils.getAutoBean(sourceObject); // Get the corresponding AutoBean. 
    HasSplittable splittableBean = (HasSplittable) sourceBean;  // Implementation (if still AbstractAutoBean) supports this interface ;) 
    Splittable splittable = splittableBean.getSplittable().deepCopy(); // If you don't copy it, decode() tries to be clever and returns 
                     // the original bean! 
    AutoBean<B> targetBean = AutoBeanCodex.decode(typeFactory, targetClass, splittable); // Create new AutoBean of 
                          // the target type. 
    return targetBean.as(); // Get the proxy for the outside world. 
} 

--Where typeFactory फैली AutoBeanFactory, जैसा कि आप देख सकते हैं: तो मैं इस तरह एक विधि लिखा था।

यह मेरे लिए काफी अच्छा काम करता है। सबसे कठिन बिट हैस्प्लिटेबल को कास्ट किया गया था, क्योंकि ऑटोबीन उस इंटरफ़ेस का विस्तार नहीं करता है, लेकिन एबस्ट्रेटऑनबीन (जो ऑटोबीन लागू करता है) करता है - और इसके उप-वर्ग को एट्यूबबीन() प्राप्त करने के लिए कॉल द्वारा वापस किया जाता है।

आपको स्प्लिटेबल की प्रतिलिपि बनाने की भी आवश्यकता है, अन्यथा ऑटोबीनकोडेक्स सोचता है, "अरे, मेरे पास पहले से ही उस स्प्लिटेबल के लिए ऑटोबीन है! यहाँ आप जाओ!" - और सिर्फ आपको मूल देता है। ;)

वैसे भी, आप नीचे की ओर, ऊपर की तरफ जा सकते हैं ... किनारे!: पी

देर से संपादित करें: इस महीने बाद में इस पर ठोकर खाई, मुझे लगा कि मैं नीचे जोनाथन का उल्लेख करता हूं, उसके बारे में एक छोटी सी चेतावनी जोड़ूंगा। जिस विधि को मैंने यहां वर्णित किया है उसे ऑटोबीन पर इस्तेमाल करने के लिए डिज़ाइन किया गया है जिसे इसे रद्द कर दिया गया है क्योंकि इसे संशोधित नहीं किया गया है। ऐसा इसलिए है क्योंकि (AFAIK) इस बात की कोई गारंटी नहीं है कि आपके द्वारा कॉल किए गए किसी भी सेटर वास्तव में JSON (कास्टिंग के लिए आवश्यक) अपडेट करेंगे। यह शायद एक बड़ा सौदा नहीं है, क्योंकि आमतौर पर जब आप आने वाले डीटीओ होते हैं तो आप इसका उपयोग करेंगे और आप इसके साथ कुछ और करने से पहले, इसे वास्तविक टाइप ASAP टाइप करना चाहते हैं। हमारे मामले में, हमारे ऑटोबीन में से कोई भी सेटर्स नहीं था, इसलिए यह वास्तव में एक मुद्दा नहीं था। ;)

इसे डालने के बाद, आप परिणामस्वरूप बीन के साथ जो भी चाहें कर सकते हैं, जो कारखाने से ताजा है!

+0

मैं AutoBeans के साथ इसी तरह काम करने के लिए मिला है, लेकिन मैं एक AutoBean Splittable विभाजन = AutoBeanCodex.encode (AutoBeanUtils.getAutoBean (sourceBean)) से Splittable प्राप्त करने के लिए एक पूर्ण एनकोड करते हैं; – Jonathan

+0

@ जोनाथन मैंने 'AutoBeanCodex.encode()' की कोशिश की; यह उथल-पुथल के लिए काम करता है, लेकिन डाउनकास्टिंग के लिए नहीं - एक शर्म की बात है क्योंकि यह करने का एक आसान तरीका होगा। :) 'एनकोड()' नए 'स्प्लिटेबल' उत्पन्न करने के लिए बीन के गुणों को पार करने के लिए विज़िटर पैटर्न का उपयोग करता है। अफसोस की बात है, स्रोत जेएसओएन में ऐसे गुण हैं जो उस बीन के माध्यम से सुलभ नहीं हैं, लेकिन इसे 'डाउनकास्ट' करने के लिए जरूरी है ... और आगंतुक उन्हें नहीं देखता है, इसलिए JSON को 'एन्कोड() '' स्प्लिटेबल से उनके पास नहीं है। :( ... इसलिए अजीब तरह से 'स्प्लिटेबल' सीधे प्राप्त करना और इसे कॉपी करना; यह सही ढंग से डीकोड करता है क्योंकि सभी जानकारी अभी भी वहां है। –

+0

मुझे लगता है कि आप क्या प्राप्त कर रहे हैं। अब मुझे लगता है कि दोनों तकनीकों में उनकी तकनीक है मामलों का प्रयोग करें। मैं ऊपर बताई गई विधि का उपयोग कर रहा हूं क्योंकि ज्यादातर समय जब मैं एक ऑटोबेन को दूसरे में बदल रहा हूं, तो मैंने ऐसा करने से पहले बदलाव किए हैं। इसलिए उस मामले में, मुझे पूर्ण विज़िटर ट्रैवर्सल क्रम में चाहिए सभी सही संशोधित जानकारी प्राप्त करने के लिए। 'हैस्प्लिटेबल' का उपयोग करने के बाद से फिसलन ढलान बढ़िया हो सकता है यदि आपने कोई बदलाव नहीं किया है, और आप ** जानते हैं ** कि कोई बदलाव नहीं किए गए हैं। अन्यथा, आप केवल पसंद हैं पूर्ण एन्कोड करने के लिए। जब ​​तक मुझे कुछ याद नहीं आ रहा है ..... – Jonathan

0

मैं ऑटोबीन से बहुत परिचित नहीं हूं लेकिन आप शायद RestyGWT से serializer/deserializer का उपयोग कर सकते हैं। यह एनोटेशन का उपयोग करके बहुरूपता का समर्थन करता है। प्रलेखन के लिए

लिंक: http://restygwt.fusesource.org/documentation/restygwt-user-guide.html#Polymorphic_Sub_Types

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

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