ActionScript 3 में SOAP वेब सेवा के लिए "Null" (एक वास्तविक उपनाम!) कैसे पास करें


4635

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

<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

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

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

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


6
यह विशिष्ट समस्या के साथ आपकी बहुत मदद नहीं कर सकता है, लेकिन SOAP 1.2 अशक्त
JensG

6
मुझे लगता है कि इसमें डेव नल शामिल है।
जॉर्ज गिब्सन

2
कम से कम इसमें चक नॉरिस शामिल नहीं है। यहाँ कोड में उससे दूर रहने के लिए क्यों है: codequeeze.com/…
एसडीसोलर

42
क्या कर्मचारी को अपना नाम बदलने के लिए माना जाता है?
तात्रेन्स्किमवेद

11
उसे वास्तव में एक पॉइंटर डॉग खरीदने और उसे नुल्पॉइंटर कहने पर विचार करना चाहिए ।
एंटोनियो अल्वारेज़

जवाबों:


1108

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

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

जब से मैंने Wonderfl.net पर बहुत सी फ़िदालिंग की है और कोड के माध्यम से ट्रेस कर रहा हूँ mx.rpc.xml.*XMLEncoder(3.5 स्रोत में) की लाइन 1795 में setValue, सभी में, एक्सएलनेकोडिंग के लिए नीचे फोड़े

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

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

currentChild.appendChild("null");

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

कारण

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

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", तो यह पहले इसे पाठ के साथ रूट XML तत्व में बदल देता है null, और फिर उस तत्व को अशक्त शाब्दिक के खिलाफ परीक्षण करता है। यह एक कमजोर समानता परीक्षण है, इसलिए या तो XML युक्त null शून्य प्रकार के लिए coerced है, या null प्रकार रूट "xull" युक्त रूट xml तत्व के लिए coerced है, और परीक्षण पास होता है जहां यह यकीनन विफल होता है। एक निश्चितता हमेशा "nullness" के लिए XML (या कुछ भी, वास्तव में) की जाँच करते समय सख्त समानता परीक्षणों का उपयोग करना हो सकता है ।

समाधान

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

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


298

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

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


239

समस्या फ्लेक्स के SOAP एनकोडर में हो सकती है। अपने फ्लेक्स एप्लिकेशन में SOAP एनकोडर को विस्तारित करने का प्रयास करें और प्रोग्राम को डिबग करके देखें कि नल का मान कैसे संभाला जाता है।

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


12
नाम = "नल" बेशक उपयोगी है, और मैं नहीं देखता कि इसे NaN से कैसे संबंधित होना चाहिए।
eckes

129

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

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

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

(मैंने फ्लेक्स 4.5.1 एसडीके को देखा; पंक्ति संख्या अन्य संस्करणों में भिन्न हो सकती है।)

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

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

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

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

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


11/16/2013 अपडेट :

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

इस तरह की जाँच करें:

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

यह ColdFusion 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>

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

null string = = condition का उपयोग करके null आरक्षित शब्द के बराबर नहीं है

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

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


8
@ Reboog711 कर्मचारी का अंतिम नाम शाब्दिक रूप से "Null" है, "My name is Pat Null" आपका उत्तर कर्मचारी के अंतिम नाम को पारित करने में विफल रहता है। आप केवल इस तथ्य को छिपाते हैं कि बेन बर्न्स द्वारा बताए अनुसार "नल" को एपेंडचाइल्ड () विधि द्वारा अनुचित रूप से अशक्त की भाषा अवधारणा में समाहित किया जा रहा है। परिणाम अभी भी श्री या सुश्री नल से निपटने के लिए प्रणाली की विफलता है।
मैक्सक्स डेमन

2
@MaxxDaymon मुझे लगता है कि आप मेरा जवाब वास्तव में गलत है। यह एक समाधान प्रस्तुत नहीं करता है; बल्कि समस्या क्यों होती है इसका स्पष्टीकरण; और फ्लेक्स फ्रेमवर्क से संबंधित कोड को कोट करता है। मेरा हालिया संपादन शायद गलत है; क्योंकि यह एक वैकल्पिक दृष्टिकोण पर चर्चा करता है और मूल प्रश्न से सीधे संबंधित नहीं है।
जेफ्रीहॉसर

1
आप सही रास्ते पर हैं, लेकिन उस बिंदु पर कोड contentमें स्ट्रिंग है "null", और "null" == अशक्त गलत है, ताकि परीक्षण उद्देश्य के अनुसार व्यवहार करता है। इसके बजाय मेरा मानना ​​है कि समस्या एक मिश्रण है कि XML.appendChild एक स्ट्रिंग तर्क को कैसे संभालता है, और केवल रूट "null" वाले रूट XML तत्व को शाब्दिक रूप से कैसे पढ़ा जा सकता है null
बेन बर्न्स 16

@ Reboog711 मेरी बेला पर एक नजर। "null"! = null` लौटकर trueयहां वांछित व्यवहार है। यदि विपरीत हुआ, तो यह एन्कोडिंग प्रक्रिया से स्ट्रिंग "नल" को छोड़ देगा, जो वास्तव में समस्या का कारण होगा। हालाँकि, क्योंकि यह परीक्षण सफल होता है, एन्कोडर तब तक चलता रहता है, जब तक XML.appendChild एक बग के कारण इसे छोड़ देता है।
बेन बर्न्स

4
कोई चिंता नहीं। यदि आप वास्तविक समस्या var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);को अपने कोड नमूने में जोड़ना चाहते हैं।
बेन बर्न्स

65

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


41
कृपया ऐसा न करें। CDATA उन मामलों में उपयोग के लिए बनाया गया था जहां आपको पाठ के पूरे ब्लॉक से बचने की आवश्यकता होती है।
बेन बर्न्स

4
मैं गलत हो सकता हूं, लेकिन मुझे नहीं लगता कि यह सिर्फ इसलिए गलत है क्योंकि यह आपका समाधान नहीं था कि यह कैसे काम करना चाहिए। इसके अलावा, आपको समस्या को हल करने के लिए ध्यान रखना होगा क्योंकि समाधान के लिए कोई स्पष्ट तरीका नहीं है, क्योंकि पोस्ट किए गए समाधानों की विविधता से स्पष्ट होता है। अंत में, मैं सीएफ को नहीं जानता, ध्यान में रखते हुए, एक डिकोडर सिर्फ <संदेश> के आंतरिक पाठ की बराबरी नहीं करता है </> [सीडीएटीए [NULL]]> </ संदेश> आंतरिक संदेश के <text> NULL </ संदेश>? यदि हां, तो क्या CDATA वास्तव में एक समाधान है?
doogle

7
मैंने इसे गलत ठहराया क्योंकि यह एक प्रतिमान है। इस मामले में बग CF में नहीं है, यह ActionScript में है। हालाँकि, आप फिर भी एक अच्छा मुद्दा उठाते हैं। मैं सीडीएटीए एन्कोडिंग के लिए अपने फिडेल में एक परीक्षण जोड़ूंगा।
बेन बर्न्स

51

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


हां, यहां कई संभावनाएं हैं, जिन्हें कम करने के लिए अधिक डीबगिंग की आवश्यकता होगी। 1) क्या डब्ल्यूएसडीएल का उपयोग यहां अभिव्यंजक रूप से "नाल" के बीच एक स्ट्रिंग मान और वास्तविक अशक्त (या लोप) मान के बीच अंतर करने के लिए पर्याप्त है? 2) यदि ऐसा है, तो क्या ग्राहक अंतिम नाम को सही तरीके से कूट रहा है (एक स्ट्रिंग के रूप में और एक शून्य शाब्दिक के रूप में नहीं) 3) यदि ऐसा है, तो क्या सेवा "NULL" को एक स्ट्रिंग के रूप में ठीक से व्याख्या कर रही है, या इसे एक शून्य मान के लिए मजबूर कर रही है?
pimlottc

39

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

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


32
XXNULLXX एक नाम भी हो सकता है। तुम्हें पता नहीं है। हो सकता है कि इंडोनेशिया में लोगों के पास उपनाम नहीं है और आवश्यकता पड़ने पर XXX के एक संस्करण को उनके उपनाम के रूप में उपयोग करते हैं।
जी.बी.

3
समान अवधारणा, लेकिन डेटाबेस में सभी नामों को अपडेट करें और फिर कुछ चरित्र (1Null, 1Sith) के साथ प्रस्तावना करें। क्लाइंट में उस चरित्र को बंद करें। बेशक यह Reboog के समाधान की तुलना में घुन का काम हो सकता है।
बोबापुल

14
@BenBurns हाँ, लेकिन क्या होगा अगर मैं अपने बच्चे का नाम रखना चाहता हूँ &#78;&#117;&#108;&#108;?
सायरन

@ सीन जो समस्या नहीं है। यदि मेरा नाम "<& quot;>" है, तो मैं उम्मीद करता हूं कि यह ठीक से & quot; & lt; & amp; quot; & gt; & quot; के रूप में बच जाए; असली समस्या एक अनुप्रयोग व्यवहार के साथ है जैसे कि वह नामों के लिए एक ब्लैकलिस्ट का उपयोग करता है।
श्री लिस्टर

30

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

<childtag2 xsi:nil="true" />

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

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

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


6
यहाँ अच्छी जानकारी है, इसलिए मैं नीचे नहीं जाऊंगा, लेकिन मुझे लगा कि यह एक टिप्पणी के लायक है। डिफ़ॉल्ट रूप से, XMLEncoder.as वास्तव में एक सच्चे nullमूल्य को ठीक से एनकोड करेगा , xsi:nil="true"तत्व पर सेट करके । समस्या वास्तव में एक्शनस्क्रिप्ट XMLटाइप करने के तरीके से प्रतीत होती है (एनकोडर नहीं) स्ट्रिंग को संभालती है "null"
बेन बर्न्स

22

यह एक kludge है, लेकिन यह सोचते हैं वहाँ के लिए एक न्यूनतम लंबाई है SEARCHSTRING2 अक्षर, उदाहरण के लिए, दूसरा चरित्र पर पैरामीटर और यह दो पैरामीटर के रूप में के बजाय पारित: और उन्हें वापस एक साथ जब डेटाबेस के लिए क्वेरी को क्रियान्वित।substringSEARCHSTRINGSEARCHSTRING1 ("Nu")SEARCHSTRING2 ("ll"). Concatenate


32
इन प्रकार के कीड़ों से बचने के लिए CDATA को XML युक्ति में जोड़ा गया था।
बेन बर्न्स

8
सीडीएटीए के साथ "नल" से बचने की कोई आवश्यकता नहीं है, एक्सएमएल में एक शून्य कीवर्ड जैसी कोई चीज नहीं है।
अपराह्न

6
@Eckes से सहमत हैं। मुझे समझ में नहीं आ रहा है कि सीडीएटीए की यह सब चर्चा क्यों है। CDATA केवल उन वर्णों से बचने के लिए उपयोगी है जिनका XML में विशेष अर्थ है। में से कोई भी: n, u, lएक्सएमएल में विशेष अर्थ विज्ञान है। "NULL" और "<! [CDATA [NULL]]>" एक XML पार्सर के समान हैं।
jasonkarns

9
@ केसोनकरन्स - मैं 100% सहमत हूं कि स्ट्रिंग / टेक्स्ट नोड के बारे में कुछ खास नहीं होना चाहिएNULL , लेकिन पांडित्यपूर्ण होना चाहिए, <blah>null</blah>और <blah><![CDATA[null]]>एक्सएमएल पार्सर के समान नहीं हैं। उन्हें एक ही परिणाम का उत्पादन करना चाहिए , हालांकि उन्हें संभालने के लिए तर्क प्रवाह अलग है। यह प्रभाव है कि हम फ्लेक्स XML कार्यान्वयन में बग के लिए समाधान के रूप में शोषण कर रहे हैं। मैं अन्य दृष्टिकोणों के लिए इसके लिए वकालत करता हूं क्योंकि यह पाठ की पठनीयता को बरकरार रखता है, और अन्य पार्सर्स के लिए इसका कोई दुष्प्रभाव नहीं है।
बेन बर्न्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.