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


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

<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

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


4475
2017-12-16 00:42


मूल


यह आपको विशिष्ट समस्या के साथ बहुत मदद नहीं कर सकता है, लेकिन SOAP 1.2 शून्य मूल्यों के लिए अनुमति देता है, देखें w3.org/TR/2001/WD-soap12-20010709/#_Toc478383513 - JensG
मुझे एहसास है कि इसमें डेव नल शामिल है। - George Gibson
कम से कम इसमें चक नॉरिस शामिल नहीं है। कोड में उससे दूर रहने का कारण यहां दिया गया है: codesqueeze.com/... - SDsolar
क्या कर्मचारी ने अपना नाम बदलना माना है? - Tatranskymedved
बीबीसी पर संदर्भित: bbc.com/future/story/... - biziclop


जवाब:


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

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

मैंने तब से बहुत कुछ किया है wonderfl.net पर fiddling और कोड के माध्यम से ट्रेसिंग mx.rpc.xml.*। लाइन 17 9 5 में XMLEncoder (3.5 स्रोत में), में setValue, सभी XMLEncoding नीचे उबलता है

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

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

currentChild.appendChild("null");

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

 कारण

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

उपाय

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

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


1049
2017-08-01 17:31





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

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


286
2018-04-27 20:00





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

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


235
2018-01-16 08:13



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


@ 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>

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

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

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

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


125
2018-05-03 15:51



@ Reboog711 कर्मचारी का अंतिम नाम सचमुच स्ट्रिंग "नल" जैसा है, "मेरा नाम पैट नल है" आपका उत्तर कर्मचारी के अंतिम नाम को पार करने में विफल रहता है। आप जवाब देते हैं कि इस तथ्य को छिपाते हैं कि "नल" को बेन बर्न्स द्वारा वर्णित appendChild () विधि द्वारा शून्य की भाषा अवधारणा में अनुपयुक्त रूप से शामिल किया जा रहा है। परिणाम श्रीमान या सुश्री नल से निपटने के लिए सिस्टम की विफलता अभी भी है। - Maxx Daymon
@MaxxDaymon मुझे लगता है कि आप गलत जवाब देते हैं कि मेरा जवाब वास्तव में क्या है। यह एक समाधान पेश नहीं करता है; बल्कि समस्या का कारण क्यों है इसका एक स्पष्टीकरण; और फ्लेक्स फ्रेमवर्क से प्रासंगिक कोड उद्धृत करता है। मेरा हालिया संपादन शायद गलत है; क्योंकि यह एक वैकल्पिक दृष्टिकोण पर चर्चा करता है और सीधे मूल प्रश्न से संबंधित नहीं है। - JeffryHouser
आप सही रास्ते पर हैं, लेकिन उस बिंदु पर कोड में content स्ट्रिंग है "null", और "शून्य" == शून्य शून्य लौटाता है, ताकि परीक्षण इरादे से व्यवहार कर सके। इसके बजाय मेरा मानना ​​है कि समस्या यह है कि XML.appendChild एक स्ट्रिंग तर्क को कैसे संभालता है, और कैसे रूट एक्सएमएल तत्व केवल स्ट्रिंग "नल" युक्त होता है, उसे शाब्दिक रूप से जोड़ा जा सकता है null। - Ben Burns
@ Reboog711 मेरी पहेली पर एक नज़र डालें। "शून्य"! = शून्य 'लौट रहा है true यहां वांछित व्यवहार है। यदि विपरीत हुआ, तो यह एन्कोडिंग प्रक्रिया से "शून्य" स्ट्रिंग को त्याग देगा, जो वास्तव में समस्या का कारण होगा। हालांकि, क्योंकि यह परीक्षण सफल होता है, एन्कोडर तब तक चलता रहता है जब तक XML.appendChild एक जबरदस्त बग के कारण इसे छोड़ देता है। - Ben Burns
कोई चिंता नहीं। यदि आप असली समस्या जोड़ना चाहते हैं var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s); आपके कोड नमूने के लिए। - Ben Burns


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


62
2018-04-30 19:03



कृपया यह मत करो। सीडीएटीए उन मामलों में उपयोग के लिए बनाया गया था जहां आपको टेक्स्ट के पूरे ब्लॉक से बचने की आवश्यकता है। - Ben Burns
मैं गलत हो सकता था, लेकिन मैं सिर्फ इसलिए नहीं सोच रहा था क्योंकि यह नहीं था तुंहारे समाधान यह है कि यह कैसे काम करना चाहिए। इसके अलावा आपको एक हेरिस्टिक समाधान के लिए समस्या को ध्यान में रखना होगा क्योंकि पोस्ट किए गए समाधानों की विविधता से स्पष्ट रूप से एक स्पष्ट तरीका नहीं है। आखिरकार, ध्यान में रखते हुए मुझे सीएफ नहीं पता, एक डिकोडर <message> <! [सीडीएटीए [एनयूएलएल]]> </ message> के आंतरिक पाठ को <message> NULL </ संदेश>? यदि हां, तो क्या सीडीएटीए वास्तव में एक समाधान है? - doogle
मैं downvoted क्योंकि यह एक विरोधी पैटर्न है। इस मामले में बग सीएफ में नहीं है, यह एक्शनस्क्रिप्ट में है। हालांकि, आप फिर भी एक अच्छा मुद्दा उठाते हैं। मैं सीडीएटीए एन्कोडिंग के लिए अपने पहेली में एक टेस्ट जोड़ूंगा। - Ben Burns


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


49
2018-04-28 20:15



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


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

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


36
2018-04-28 08:43



XXNULLXX भी एक नाम हो सकता है। आप नहीं जानते हो सकता है कि इंडोनेशिया में लोगों के पास उपनाम नहीं है और आवश्यकता होने पर उनके उपनाम के रूप में XXX का एक संस्करण उपयोग करें। - gb.
या, यानो, हमेशा सीडीएटीए है ... - Ben Burns
वही अवधारणा है, लेकिन कुछ चरित्र (1 नल, 1 स्मिथ) के साथ डेटाबेस और प्रस्तावना में सभी नाम अपडेट करें। ग्राहक में उस चरित्र को बंद करो। बेशक यह Reboog के समाधान से पतंग काम हो सकता है। - bobpaul
@ बेनबर्न हाँ, लेकिन अगर मैं अपने बच्चे को नाम देना चाहता हूं तो क्या होगा &#78;&#117;&#108;&#108;? - Sirens
@ साइरेन यह समस्या नहीं है। अगर मेरा नाम "<& quot;>" है, तो मुझे उम्मीद है कि इसे बिना किसी कहने के & quot; & lt; & amp; quot; & gt; & quot; के रूप में ठीक से बचने की उम्मीद है। वास्तविक समस्या एक अनुप्रयोग के साथ व्यवहार कर रही है जैसे कि यह नामों के लिए ब्लैकलिस्ट का उपयोग करती है। - Mr Lister


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

<childtag2 xsi:nil="true" />

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

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

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


30
2017-07-17 07:56



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