flex एक्शनस्क्रिप्ट 3 में एक एसओएपी वेब सेवा के लिए "नल"(असली उपनाम!) कैसे पास करें?




actionscript soap (8)

हमारे पास एक कर्मचारी है जिसका उपनाम शून्य है। हमारे कर्मचारी लुकअप एप्लिकेशन को तब मार दिया जाता है जब उस अंतिम नाम को खोज शब्द के रूप में उपयोग किया जाता है (जो अब अक्सर होता है)। त्रुटि मिली (धन्यवाद फिडलर!) है:

<soapenv:Fault>
   <faultcode>soapenv:Server.userException</faultcode>
   <faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>

प्यारा, हुह?

पैरामीटर प्रकार string

मै इस्तेमाल कर रहा हूँ:

  • डब्ल्यूएसडीएल (एसओएपी)
  • फ्लेक्स 3.5
  • एक्शनस्क्रिप्ट 3
  • कोल्डफ्यूजन 8

ध्यान दें कि वेब सेवा को कोल्डफ्यूजन पृष्ठ से ऑब्जेक्ट के रूप में कॉल करते समय त्रुटि उत्पन्न नहीं होती है।


खैर, मुझे लगता है कि एसओएपी एनकोडर का फ्लेक्स 'कार्यान्वयन गलत मूल्यों को गलत तरीके से क्रमबद्ध करने लगता है। स्ट्रिंग नल के रूप में उन्हें क्रमबद्ध करना एक अच्छा समाधान प्रतीत नहीं होता है। औपचारिक रूप से सही संस्करण एक शून्य मान को पास करने के लिए प्रतीत होता है:

<childtag2 xsi:nil="true" />

तो "नल" का मान मान्य स्ट्रिंग से कुछ और नहीं होगा, जो वही है जो आप खोज रहे हैं।

मुझे लगता है कि अपाचे फ्लेक्स में यह तय करना मुश्किल नहीं होना चाहिए। मैं जिरा मुद्दे खोलने या अपाचे-फ्लेक्स मेलिंगलिस्ट के लोगों से संपर्क करने की सलाह दूंगा। हालांकि यह केवल ग्राहक पक्ष को ठीक करेगा। मैं यह नहीं कह सकता कि क्या कोल्डफ्यूजन इस तरह से एन्कोड किए गए शून्य मानों के साथ काम करने में सक्षम होगा।

राडू कोटेक्सू के ब्लॉग पोस्ट को भी देखें, साबुनयूआई अनुरोधों में शून्य मूल्य कैसे भेजें


@ doc_180 में सही अवधारणा थी, सिवाय इसके कि वह संख्याओं पर केंद्रित है, जबकि मूल पोस्टर के तारों के साथ समस्याएं थीं।

समाधान mx.rpc.xml.XMLEncoder फ़ाइल को बदलने के लिए है। यह लाइन 121 है

    if (content != null)
        result += content;

[मैंने फ्लेक्स 4.5.1 एसडीके देखा; लाइन संस्करण अन्य संस्करणों में भिन्न हो सकते हैं]

असल में, सत्यापन विफल रहता है क्योंकि 'सामग्री शून्य है' और इसलिए आपका तर्क आउटगोइंग एसओएपी पैकेट में नहीं जोड़ा गया है; इस प्रकार गायब पैरामीटर त्रुटि उत्पन्न कर रहा है।

सत्यापन को हटाने के लिए आपको इस कक्षा का विस्तार करना होगा। फिर श्रृंखला में एक बड़ा स्नोबॉल है, जो आपके संशोधित XMLEncoder का उपयोग करने के लिए SOAPEncoder को संशोधित करता है, और उसके बाद अपने संशोधित SOAPEncoder का उपयोग करने के लिए ऑपरेशन को संशोधित करता है, और फिर अपने वैकल्पिक ऑपरेशन क्लास का उपयोग करने के लिए वेब सेवा का उपयोग कर रहा है।

मैंने इस पर कुछ घंटे बिताए, लेकिन आगे बढ़ने की जरूरत है। यह शायद एक या दो दिन ले जाएगा।

आप XMLEncoder लाइन को ठीक करने में सक्षम हो सकते हैं और अपनी खुद की कक्षा का उपयोग करने के लिए कुछ बंदर पैचिंग कर सकते हैं।

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

11/16/2013 अद्यतन :

मेरे पास RemoteObject / AMF के बारे में मेरी अंतिम टिप्पणी में एक और हालिया जोड़ा है। यदि आप CF10 का उपयोग कर रहे हैं; तो किसी ऑब्जेक्ट पर शून्य मान वाले गुण सर्वर साइड ऑब्जेक्ट से हटा दिए जाते हैं। इसलिए, आपको इसे एक्सेस करने से पहले गुणों के अस्तित्व की जांच करनी होगी या आपको रनटाइम त्रुटि मिलेगी। इस तरह की जांच करें:

<cfif (structKeyExists(arguments.myObject,'propertyName')>
 <!--- no property code --->
<cfelse>
 <!--- handle property  normally --->
</cfif>

यह सीएफ 9 से व्यवहार में बदलाव है; जहां शून्य गुण खाली तारों में बदल जाएंगे।

12/6/2013 संपादित करें

चूंकि यहां कोई सवाल नहीं था कि कैसे नल का इलाज किया जाता है, यह दिखाने के लिए एक त्वरित नमूना अनुप्रयोग है कि स्ट्रिंग "नल" आरक्षित शब्द नल से कैसे संबंधित होगा।

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_initializeHandler(event:FlexEvent):void
            {
                var s :String = "null";
                if(s != null){
                    trace('null string is not equal to null reserved word using the != condition');
                } else {
                    trace('null string is equal to null reserved word using the != condition');
                }

                if(s == null){
                    trace('null string is equal to null reserved word using the == condition');
                } else {
                    trace('null string is not equal to null reserved word using the == condition');
                }

                if(s === null){
                    trace('null string is equal to null reserved word using the === condition');
                } else {
                    trace('null string is not equal to null reserved word using the === condition');
                }

            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
</s:Application>

ट्रेस आउटपुट है:

नल स्ट्रिंग! = स्थिति का उपयोग कर शून्य आरक्षित शब्द के बराबर नहीं है

नल स्ट्रिंग == स्थिति का उपयोग कर शून्य आरक्षित शब्द के बराबर नहीं है

नल स्ट्रिंग === स्थिति का उपयोग कर शून्य आरक्षित शब्द के बराबर नहीं है


एक्सकेसीडी नोट पर , बॉबी टेबल्स वेबसाइट में उपयोगकर्ता डेटा की अनुचित व्याख्या से बचने के लिए अच्छी सलाह है (इस मामले में, ColdFusion समेत विभिन्न भाषाओं में एसक्यूएल प्रश्नों में स्ट्रिंग "नल")।

यह सवाल से स्पष्ट नहीं है कि यह समस्या का स्रोत है, और समाधान को पहले जवाब (एक संरचना में पैरामीटर एम्बेड करने) के टिप्पणी में नोट किया गया है, ऐसा लगता है कि यह कुछ और था।


एक्शनस्क्रिप्ट में एक null मान को स्ट्रिंग करने से स्ट्रिंग "NULL" न्यूल "NULL" देगी। मेरा संदेह यह है कि किसी ने फैसला किया है कि, स्ट्रिंग "NULL" को null रूप में डीकोड करना एक अच्छा विचार है, जिससे आप यहां देख रहे ब्रेकेज का कारण बन सकते हैं - शायद इसलिए कि वे null वस्तुओं में गुजर रहे थे और डेटाबेस में स्ट्रिंग प्राप्त कर रहे थे, वे यह नहीं चाहते थे (इसलिए भी उस तरह की बग की जांच करना सुनिश्चित करें)।


समस्या फ्लेक्स के एसओएपी एन्कोडर में हो सकती है। अपने फ्लेक्स एप्लिकेशन में एसओएपी एन्कोडर को विस्तारित करने का प्रयास करें और यह देखने के लिए प्रोग्राम को डीबग करें कि शून्य मान कैसे प्रबंधित किया जाता है। मेरा अनुमान है, यह NaN (संख्या नहीं) के रूप में पारित किया गया है। यह कुछ समय के लिए एसओएपी संदेश unmarshalling प्रक्रिया गड़बड़ कर देगा (सबसे विशेष रूप से JBoss 5 सर्वर में ...)। मुझे एसओएपी एन्कोडर का विस्तार करना और नाएन को संभालने के तरीके पर एक स्पष्ट जांच करना याद है।

(एक तरफ ध्यान दें, क्या आप कर्मचारी आईडी नल होने पर कुछ उपयोगी करने की उम्मीद कर रहे हैं, क्या यह एक सत्यापन समस्या नहीं है? मैं गलत हो सकता हूं, क्योंकि मुझे शायद ही आवश्यकता हो ...)


सभी पात्रों को उनके हेक्स-इकाई समकक्षों में अनुवाद करें। इस मामले में, Null को &#4E;&#75;&#6C;&#6C; में परिवर्तित किया जाएगा &#4E;&#75;&#6C;&#6C;


एक हैक के रूप में, आप क्लाइंट पक्ष पर एक विशेष हैंडलिंग करने पर विचार कर सकते हैं, 'नल' स्ट्रिंग को उस चीज़ में परिवर्तित कर सकते हैं जो कभी नहीं होगा, उदाहरण के लिए, XXNULLXX और सर्वर पर वापस कनवर्ट करना।

यह सुंदर नहीं है, लेकिन यह इस तरह के सीमा मामले के लिए इस मुद्दे को हल कर सकता है।


इसे नीचे ट्रैक करना

सबसे पहले मैंने सोचा कि यह एक जबरदस्त बग था जहां null "null" लिए मजबूर हो रहा था और "null" == null का परीक्षण हो रहा था। यह। मैं करीब था, लेकिन बहुत, बहुत गलत। उसके लिए माफ़ करना!

मैंने बाद में wonderfl.net पर बहुत सारे झुकाव किए हैं और mx.rpc.xml में कोड के माध्यम से पता mx.rpc.xml.*XMLEncoder (3.5 स्रोत में) के 1795 लाइन पर, setValue , सभी XMLEncoding नीचे उबलते हैं

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

जो अनिवार्य रूप से वही है:

currentChild.appendChild("null");

यह कोड, मेरे मूल पहेली के अनुसार, एक खाली एक्सएमएल तत्व देता है। पर क्यों?

कारण

टिप्पणीकर्ता जस्टिन FLEX-33664 अनुसार बग रिपोर्ट FLEX-33664 , निम्नलिखित अपराधी है (मेरे FLEX-33664 पिछले दो परीक्षण देखें जो इसे सत्यापित करते हैं):

var thisIsNotNull:XML = <root>null</root>;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

जब currentChild.appendChild स्ट्रिंग "null" को पारित कर दिया जाता है, तो यह पहले इसे रूट null साथ रूट एक्सएमएल तत्व में परिवर्तित करता है, और फिर शून्य तत्व के खिलाफ उस तत्व का परीक्षण करता है। यह एक कमजोर समानता परीक्षण है, इसलिए या तो एक्सएमएल युक्त नल को शून्य प्रकार के लिए मजबूर किया जाता है, या शून्य प्रकार को रूट xml तत्व में "शून्य" युक्त स्ट्रिंग होता है, और परीक्षण पास होता है जहां यह तर्कसंगत रूप से विफल होना चाहिए। "फुलनेस" के लिए एक्सएमएल (या कुछ भी, वास्तव में) की जांच करते समय एक फिक्स हमेशा सख्त समानता परीक्षणों का उपयोग करना हो सकता है।

उपाय

एक्शनस्क्रिप्ट के प्रत्येक हानिकारक संस्करण में इस बग को ठीक करने के लिए एकमात्र उचित कामकाज, मैं सोच सकता हूं, "शून्य" के लिए फ़ील्ड का परीक्षण करना और उन्हें सीडीएटीए मानों से बचाना है ।

सीडीएटीए मान पूरे टेक्स्ट वैल्यू को म्यूटेट करने का सबसे उपयुक्त तरीका है जो अन्यथा एन्कोडिंग / डिकोडिंग समस्याओं का कारण बनता है। उदाहरण के लिए, हेक्स एन्कोडिंग, व्यक्तिगत पात्रों के लिए है। जब आप किसी तत्व के पूरे पाठ से बच रहे हों तो सीडीएटीए मानों को प्राथमिकता दी जाती है। इसका सबसे बड़ा कारण यह है कि यह मानव पठनीयता को बनाए रखता है।