Pertanyaan Bagaimana cara melewatkan "Null" (nama asli yang sebenarnya!) Ke layanan web SOAP di ActionScript 3?


Kami memiliki karyawan yang nama belakangnya Null. Aplikasi pencarian karyawan kami terbunuh ketika nama belakang digunakan sebagai istilah pencarian (yang sekarang cukup sering). Kesalahan yang diterima (terima kasih Fiddler!) Adalah:

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

Imut, ya?

Tipe parameternya adalah string.

Saya menggunakan:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

Perhatikan bahwa kesalahan tidak terjadi saat memanggil webservice sebagai objek dari halaman ColdFusion.


4474
2017-12-16 00:42


asal


Jawaban:


 Melacaknya

Pada awalnya saya pikir ini adalah bug paksaan di mana null sedang dipaksa untuk "null" dan ujian "null" == null sedang lewat. Ini bukan. Saya dekat, tapi sangat, sangat salah. Maaf tentang itu!

Saya telah melakukan banyak hal mengotak-atik wonderfl.net dan menelusuri kode di mx.rpc.xml.*. Pada baris 1795 dari XMLEncoder (dalam sumber 3,5), di setValue, semua XMLEncoding bermuara

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

yang pada dasarnya sama dengan:

currentChild.appendChild("null");

Kode ini, menurut biar asli saya, mengembalikan elemen XML kosong. Tapi kenapa?

 Sebab

Menurut komentator Justin Mclean pada laporan bug FLEX-33664, berikut ini adalah pelakunya (lihat dua tes terakhir di blog saya) biola yang memverifikasi ini):

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
}

Kapan currentChild.appendChild dilewatkan string "null", pertama mengonversinya menjadi elemen XML root dengan teks null, dan kemudian menguji elemen tersebut terhadap nol literal. Ini adalah tes kesetaraan yang lemah, jadi baik XML yang berisi null dipaksa ke jenis null, atau jenis null dipaksa untuk elemen xml root yang berisi string "null", dan tes lolos di mana itu boleh dibilang gagal. Satu perbaikan mungkin selalu digunakan kesetaraan yang ketat tes saat memeriksa XML (atau apa pun, benar-benar) untuk "nullness."

Larutan

Satu-satunya solusi yang wajar yang dapat saya pikirkan, singkat memperbaiki bug ini di setiap versi sialan ActionScript, adalah untuk menguji bidang untuk "null" dan melarikan diri dari mereka Nilai CDATA. 

Nilai CDATA adalah cara yang paling tepat untuk memutasi seluruh nilai teks yang akan menyebabkan masalah encoding / decoding. Hex encoding, misalnya, dimaksudkan untuk karakter individu. Nilai CDATA lebih disukai ketika Anda melarikan diri seluruh teks elemen. Alasan terbesar untuk ini adalah menjaga keterbacaan manusia.


1049
2017-08-01 17:31



Di atas catatan xkcd, yang Situs web Bobby Tables memiliki saran bagus untuk menghindari interpretasi data pengguna yang tidak tepat (dalam hal ini, string "Null") dalam kueri SQL dalam berbagai bahasa, termasuk ColdFusion.

Tidak jelas dari pertanyaan bahwa ini adalah sumber masalah, dan memberikan solusi yang dicatat dalam komentar untuk jawaban pertama (menanamkan parameter dalam struktur) nampaknya itu adalah sesuatu yang lain.


285
2018-04-27 20:00



Masalahnya bisa di encoder SOAP Flex. Cobalah memperluas encoder SOAP di aplikasi Flex Anda dan debug program untuk melihat bagaimana nilai null ditangani. Tebakan saya adalah, itu berlalu NaN (Bukan Angka). Ini akan mengacaukan SOAP pesan unmarshalling proses kadang-kadang (terutama di JBoss 5 server ...). Saya ingat memperluas encoder SOAP dan melakukan pemeriksaan eksplisit tentang bagaimana NaN ditangani.

(Di samping catatan, apakah Anda diharapkan untuk melakukan sesuatu yang berguna jika id karyawan Null, apakah ini bukan masalah validasi? Saya bisa salah, karena saya tidak tahu persyaratannya ...)


235
2018-01-16 08:13



@ doc_180 memiliki konsep yang benar, kecuali dia berfokus pada angka, sedangkan poster aslinya memiliki masalah dengan string.

Solusinya adalah mengubah mx.rpc.xml.XMLEncoder mengajukan. Ini garis 121

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

[Saya melihat Flex 4.5.1 SDK; nomor baris mungkin berbeda dalam versi lain]

Pada dasarnya, validasi gagal karena 'konten adalah null' dan karena itu argumen Anda tidak ditambahkan ke Paket SOAP keluar; sehingga menyebabkan kesalahan parameter yang hilang.

Anda harus memperpanjang kelas ini untuk menghapus validasi. Kemudian ada bola salju besar di rantai, memodifikasi SOAPEncoder untuk menggunakan XMLEncoder yang dimodifikasi, dan kemudian memodifikasi Operasi untuk menggunakan SOAPEncoder yang dimodifikasi, dan kemudian moidfying WebService untuk menggunakan kelas Operasi alternatif Anda.

Saya menghabiskan beberapa jam di atasnya, tetapi harus melanjutkan. Mungkin butuh satu atau dua hari.

Anda mungkin hanya dapat memperbaiki garis XMLEncoder dan melakukan patch monyet untuk menggunakan kelas Anda sendiri.

Saya juga akan menambahkan bahwa jika Anda beralih menggunakan RemoteObject / AMF dengan ColdFusion, null dilewatkan tanpa masalah.


Pembaruan 11/16/2013:

Saya memiliki satu tambahan terbaru untuk komentar terakhir saya tentang RemoteObject / AMF. Jika Anda menggunakan CF10; kemudian properti dengan nilai null pada objek dihapus dari objek sisi server. Jadi, Anda harus memeriksa keberadaan properti sebelum mengaksesnya atau Anda akan mendapatkan error runtime. Periksa seperti ini:

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

Ini adalah perubahan perilaku dari CF9; dimana properti null akan berubah menjadi string kosong.


Sunting 12/6/2013

Karena ada pertanyaan tentang bagaimana nulls diperlakukan di sini adalah contoh aplikasi cepat untuk menunjukkan bagaimana string "null" akan berhubungan dengan kata null yang dicadangkan.

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

Output jejak adalah:

null string tidak sama dengan null reserved word menggunakan kondisi! =

null string tidak sama dengan kata null reserved menggunakan kondisi ==

null string tidak sama dengan kata null reserved menggunakan kondisi ===


125
2018-05-03 15:51



Terjemahkan semua karakter ke dalam ekuivalen hex-entity. Pada kasus ini, Null akan dikonversi menjadi &#4E;&#75;&#6C;&#6C;


62
2018-04-30 19:03



Stringifying a null nilai dalam ActionScript akan memberikan string "NULL". Kecurigaan saya adalah bahwa seseorang telah memutuskan bahwa itu, oleh karena itu, ide yang baik untuk memecahkan kode string "NULL" sebagai null, menyebabkan kerusakan yang Anda lihat di sini - mungkin karena mereka lewat null objek dan mendapatkan string dalam database, ketika mereka tidak menginginkannya (jadi pastikan untuk memeriksa bug semacam itu juga).


49
2018-04-28 20:15



Sebagai hack, Anda dapat mempertimbangkan untuk memiliki penanganan khusus di sisi klien, mengubah string 'Null' menjadi sesuatu yang tidak akan pernah terjadi, misalnya, XXNULLXX dan mengkonversi kembali pada server.

Ini tidak cantik, tetapi bisa memecahkan masalah untuk kasus batas seperti itu.


36
2018-04-28 08:43



Yah, saya kira bahwa implementasi Flex dari SOAP Encoder tampaknya serialize nilai nol salah. Melakukan serialisasi sebagai String Null sepertinya bukan solusi yang baik. Versi yang secara resmi benar tampaknya akan memberikan nilai nol sebagai:

<childtag2 xsi:nil="true" />

Jadi nilai "Null" tidak lebih dari string yang valid, yang persis seperti yang Anda cari.

Saya kira memperbaikinya di Apache Flex seharusnya tidak terlalu sulit untuk diselesaikan. Saya akan merekomendasikan membuka masalah Jira atau untuk menghubungi orang-orang dari milis apache-flex. Namun ini hanya akan memperbaiki sisi klien. Saya tidak bisa mengatakan apakah ColdFusion akan dapat bekerja dengan nilai nol yang dikodekan dengan cara ini.

Lihat juga posting blog Radu Cotescu Cara mengirim nilai nol dalam permintaan soapUI.


30
2017-07-17 07:56