Kami memiliki karyawan yang bernama Null. Aplikasi pencarian karyawan kami terbunuh ketika nama belakang itu digunakan sebagai istilah pencarian (yang sekarang sudah cukup sering terjadi). 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>
Lucu ya?
Tipe parameternya adalah string
.
Saya menggunakan:
Perhatikan bahwa kesalahan tidak terjadi ketika memanggil layanan web sebagai objek dari halaman ColdFusion.
apache-flex
actionscript
soap
coldfusion
wsdl
tagihan
sumber
sumber
Jawaban:
Melacaknya
Pada awalnya saya pikir ini adalah bug paksaan di mana
null
menjadi dipaksa"null"
dan ujian"null" == null
berlalu. Ini bukan. Saya dekat, tetapi sangat, sangat salah. Maaf soal itu!Sejak itu saya telah melakukan banyak mengutak - atik wonderfl.net dan menelusuri kode di
mx.rpc.xml.*
. Pada baris 1795 dariXMLEncoder
(dalam sumber 3.5), dalamsetValue
, semua XMLEncoding bermuara padayang pada dasarnya sama dengan:
Kode ini, menurut biola asli saya, mengembalikan elemen XML yang kosong. Tapi kenapa?
Sebab
Menurut komentator Justin Mclean pada laporan bug FLEX-33664 , berikut ini adalah pelakunya (lihat dua tes terakhir di biola saya yang memverifikasi ini):
Ketika
currentChild.appendChild
dilewatkan string"null"
, pertama-tama mengubahnya menjadi elemen XML root dengan teksnull
, dan kemudian menguji elemen tersebut terhadap nol literal. Ini adalah tes kesetaraan yang lemah, sehingga XML yang berisi null dipaksakan ke tipe nol, atau tipe null dipaksakan ke elemen xml root yang berisi string "null", dan tes yang melewati tempat itu bisa dikatakan gagal. Salah satu perbaikan mungkin untuk selalu menggunakan tes kesetaraan yang ketat ketika memeriksa XML (atau apa pun, benar-benar) untuk "nullness."Larutan
Satu-satunya solusi yang masuk akal yang dapat saya pikirkan, singkat untuk memperbaiki bug ini di setiap versi ActionScript, adalah dengan menguji bidang untuk "null" dan menghindarinya sebagai nilai CDATA .Nilai CDATA adalah cara yang paling tepat untuk mengubah seluruh nilai teks yang jika tidak akan menyebabkan masalah penyandian / penguraian. Pengkodean hex, misalnya, dimaksudkan untuk karakter individu. Nilai CDATA lebih disukai ketika Anda melarikan diri dari seluruh teks elemen. Alasan terbesar untuk ini adalah menjaga keterbacaan manusia.
sumber
Pada catatan xkcd , situs web Bobby Tables memiliki saran yang baik untuk menghindari interpretasi data pengguna yang tidak benar (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 pada jawaban pertama (menanamkan parameter dalam struktur) sepertinya ada sesuatu yang lain.
sumber
Masalahnya bisa di encoder SOAP Flex. Coba rentangkan encoder SOAP di aplikasi Flex Anda dan debug program untuk melihat bagaimana nilai nol ditangani.
Dugaan saya adalah, ini dilewatkan sebagai NaN (Bukan Angka). Ini akan mengacaukan proses pembatalan pesan SOAP suatu saat (terutama di server JBoss 5 ...). Saya ingat memperluas encoder SOAP dan melakukan pemeriksaan eksplisit tentang bagaimana NaN ditangani.
sumber
@ doc_180 memiliki konsep yang benar, kecuali ia fokus pada angka, sedangkan poster aslinya memiliki masalah dengan string.
Solusinya adalah mengubah
mx.rpc.xml.XMLEncoder
file. Ini adalah baris 121:(Saya melihat Flex 4.5.1 SDK; nomor baris mungkin berbeda di versi lain.)
Pada dasarnya, validasi gagal karena 'konten adalah nol' dan karenanya argumen Anda tidak ditambahkan ke Paket SOAP keluar; sehingga menyebabkan kesalahan parameter yang hilang.
Anda harus memperluas kelas ini untuk menghapus validasi. Kemudian ada bola salju besar di rantai, memodifikasi SOAPEncoder untuk menggunakan XMLEncoder Anda yang dimodifikasi, dan kemudian memodifikasi Operasi untuk menggunakan SOAPEncoder Anda yang dimodifikasi, dan kemudian membatalkan WebService untuk menggunakan kelas Operasi alternatif Anda.
Saya menghabiskan beberapa jam untuk itu, tetapi saya harus pindah. Mungkin butuh satu atau dua hari.
Anda mungkin dapat memperbaiki baris 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 lagi untuk komentar terakhir saya tentang RemoteObject / AMF. Jika Anda menggunakan ColdFusion 10; kemudian properti dengan nilai nol pada suatu objek dihapus dari objek sisi server. Jadi, Anda harus memeriksa keberadaan properti sebelum mengaksesnya atau Anda akan mendapatkan kesalahan runtime.
Periksa seperti ini:
Ini adalah perubahan perilaku dari ColdFusion 9; di mana properti nol akan berubah menjadi string kosong.
Edit 12/6/2013
Karena ada pertanyaan tentang bagaimana null diperlakukan, berikut adalah contoh aplikasi cepat untuk menunjukkan bagaimana string "null" akan berhubungan dengan kata null yang disediakan.
Keluaran jejak adalah:
sumber
content
adalah string"null"
, dan "null" == null mengembalikan false, sehingga tes berperilaku seperti yang dimaksudkan. Alih-alih, saya percaya masalahnya adalah campuran bagaimana XML.appendChild menangani argumen string, dan bagaimana elemen XML root yang hanya berisi string "null" dapat dipaksa ke literalnull
.true
adalah perilaku yang diinginkan di sini. Jika kebalikannya terjadi, ini akan membuang string "null" dari proses pengkodean, yang sebenarnya akan menjadi penyebab masalah. Namun karena tes ini berhasil, encoder terus berjalan, sampai XML.appendChild membuangnya karena bug paksaan.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
ke sampel kode Anda.Terjemahkan semua karakter ke dalam persamaan hex-entitas mereka. Dalam hal ini,
Null
akan diubah menjadiE;KC;C;
sumber
Merangkai
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"
sebagainull
, menyebabkan kerusakan yang Anda lihat di sini - mungkin karena mereka lewat dinull
objek dan mendapatkan string dalam database, ketika mereka tidak ingin itu (jadi pastikan juga untuk memeriksa bug semacam itu).sumber
Sebagai peretasan, Anda dapat mempertimbangkan untuk memiliki penanganan khusus di sisi klien, mengubah string 'Null' menjadi sesuatu yang tidak akan pernah terjadi, misalnya, XXNULLXX dan mengonversi kembali di server.
Itu tidak cantik, tetapi bisa menyelesaikan masalah untuk kasus batas seperti itu.
sumber
Null
?Yah, saya kira implementasi Flex dari SOAP Encoder tampaknya membuat serialisasi nilai-nilai nol secara salah. Menerialisasi mereka sebagai String Null sepertinya bukan solusi yang baik. Versi yang benar secara formal tampaknya akan memberikan nilai nol sebagai:
Jadi nilai "Null" tidak lebih dari string yang valid, yang persis apa yang Anda cari.
Saya kira memperbaiki ini di Apache Flex seharusnya tidak terlalu sulit untuk dilakukan. 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 .
sumber
null
nilai sebenarnya dengan benar, dengan menetapkanxsi:nil="true"
pada elemen. Masalahnya sebenarnya tampak pada caraXML
tipe ActionScript itu sendiri (bukan encoder) menangani string"null"
.Ini kludge, tapi dengan asumsi ada panjang minimum untuk
SEARCHSTRING
, misalnya 2 karakter,substring
yangSEARCHSTRING
parameter pada karakter kedua dan lulus sebagai dua parameter sebagai gantinya:SEARCHSTRING1 ("Nu")
danSEARCHSTRING2 ("ll").
Concatenate
mereka kembali bersama-sama ketika menjalankan query ke database.sumber
n
,u
,l
memiliki semantik khusus dalam XML. "NULL" dan "<! [CDATA [NULL]]>" identik dengan parser XML.NULL
, tetapi menjadi bertele-tele,<blah>null</blah>
dan<blah><![CDATA[null]]>
tidak sama dengan parser XML. Mereka harus menghasilkan hasil yang sama, namun alur logika untuk menangani mereka berbeda. Efek inilah yang kami eksploitasi sebagai solusi untuk bug dalam implementasi XML fleksibel. Saya menganjurkan ini untuk pendekatan lain karena menjaga keterbacaan teks, dan tidak memiliki efek samping untuk parser lainnya.