Câu hỏi Làm thế nào để vượt qua "Null" (họ thực sự!) Vào một dịch vụ web SOAP trong ActionScript 3?


Chúng tôi có một nhân viên có họ là Null. Ứng dụng tra cứu nhân viên của chúng tôi bị giết khi tên cuối cùng được sử dụng làm cụm từ tìm kiếm (điều này xảy ra khá thường xuyên). Lỗi nhận được (cảm ơn Fiddler!) Là:

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

Dễ thương hả?

Loại tham số là string.

Tôi đang dùng:

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

Lưu ý rằng lỗi không làm xảy ra khi gọi webservice như một đối tượng từ trang Coldfusion.


4475
2017-12-16 00:42


gốc


Nó có thể không giúp bạn nhiều với vấn đề cụ thể, nhưng SOAP 1.2 cho phép các giá trị nullable, xem w3.org/TR/2001/WD-soap12-20010709/#_Toc478383513 - JensG
Tôi có cảm giác nó liên quan đến Dave Null. - George Gibson
Ít nhất nó không liên quan đến Chuck Norris. Đây là lý do tại sao để tránh xa anh ta trong mã: codesqueeze.com/… - SDsolar
Người lao động có cân nhắc đổi tên anh ta không? - Tatranskymedved
Tham chiếu trên BBC: bbc.com/future/story/… - biziclop


Các câu trả lời:


 Theo dõi nó xuống

Lúc đầu, tôi nghĩ đây là một lỗi cưỡng chế null đã bị ép buộc "null" và thử nghiệm "null" == null đã vượt qua. Nó không phải. Tôi đã gần gũi, nhưng rất, rất sai. Xin lỗi vì điều đó!

Tôi đã làm rất nhiều fiddling trên wonderfl.net và truy tìm thông qua mã trong mx.rpc.xml.*. Tại dòng 1795 của XMLEncoder (trong nguồn 3,5), trong setValue, tất cả XMLEncoding đều

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

về cơ bản giống như:

currentChild.appendChild("null");

Mã này, theo fiddle ban đầu của tôi, trả về một phần tử XML rỗng. Nhưng tại sao?

 Nguyên nhân

Theo bình luận viên Justin Mclean về báo cáo lỗi FLEX-33664, sau đây là thủ phạm (xem hai bài kiểm tra cuối cùng trong vĩ cầm xác minh điều này):

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
}

Khi nào currentChild.appendChild được thông qua chuỗi "null", trước tiên, nó chuyển đổi nó thành phần tử XML gốc có văn bản null, và sau đó kiểm tra phần tử đó dựa vào chữ rỗng. Đây là một thử nghiệm bình đẳng yếu, do đó, hoặc XML chứa null được ép buộc với kiểu null, hoặc kiểu null bị ép buộc thành phần tử xml gốc chứa chuỗi "null", và phép thử vượt qua nơi nó được cho là không thành công. Một sửa chữa có thể là luôn sử dụng sự bình đẳng nghiêm ngặt kiểm tra khi kiểm tra XML (hoặc bất kỳ thứ gì, thực sự) cho "nullness".

Dung dịch

Cách giải quyết hợp lý duy nhất tôi có thể nghĩ đến, thiếu sửa lỗi này trong mọi phiên bản ActionScript chết tiệt, là kiểm tra các trường cho "null" và thoát chúng như Giá trị CDATA. 

Giá trị CDATA là cách thích hợp nhất để thay đổi toàn bộ giá trị văn bản nếu không sẽ gây ra sự cố mã hóa / giải mã. Ví dụ, mã hóa hex có nghĩa là cho các ký tự riêng lẻ. Giá trị CDATA được ưu tiên khi bạn thoát toàn bộ văn bản của phần tử. Lý do lớn nhất cho điều này là nó duy trì khả năng đọc của con người.


1049
2017-08-01 17:31





Trên ghi chú xkcd, các Trang web của Bobby Tables có lời khuyên tốt để tránh việc diễn giải dữ liệu người dùng không đúng (trong trường hợp này, chuỗi "Null") trong các truy vấn SQL bằng các ngôn ngữ khác nhau, bao gồm ColdFusion.

Nó không phải là rõ ràng từ câu hỏi rằng đây là nguồn gốc của vấn đề, và đưa ra các giải pháp ghi nhận trong một bình luận cho câu trả lời đầu tiên (nhúng các tham số trong một cấu trúc) có vẻ như nó có thể là cái gì khác.


286
2018-04-27 20:00





Vấn đề có thể nằm trong bộ mã hóa SOAP của Flex. Thử mở rộng bộ mã hóa SOAP trong ứng dụng Flex của bạn và gỡ lỗi chương trình để xem cách xử lý giá trị null. Tôi đoán là, nó được chuyển thành NaN (Không phải là một con số). Điều này sẽ mess up SOAP tin nhắn unmarshalling quá trình đôi khi (đáng chú ý nhất trong JBoss 5 máy chủ ...). Tôi nhớ mở rộng bộ mã hóa SOAP và thực hiện kiểm tra rõ ràng về cách NaN được xử lý.

(Trên một mặt lưu ý, bạn có dự kiến ​​sẽ làm điều gì đó hữu ích nếu id của nhân viên là Null, đây có phải là vấn đề không hợp lệ không? Tôi có thể sai, vì tôi hầu như không biết yêu cầu ...)


235
2018-01-16 08:13



name = "Null" là tất nhiên hữu ích, và tôi không thấy làm thế nào nó nên được liên quan đến NaN. - eckes


@ doc_180 có khái niệm đúng, ngoại trừ ông tập trung vào các con số, trong khi áp phích ban đầu có vấn đề với các chuỗi.

Giải pháp là thay đổi mx.rpc.xml.XMLEncoder tập tin. Đây là dòng 121

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

[Tôi đã xem Flex 4.5.1 SDK; số dòng có thể khác trong các phiên bản khác]

Về cơ bản, xác nhận không thành công vì 'nội dung là null' và do đó đối số của bạn không được thêm vào Gói SOAP đi; do đó gây ra lỗi tham số bị thiếu.

Bạn phải mở rộng lớp này để loại bỏ xác thực. Sau đó, có một quả cầu tuyết lớn lên chuỗi, sửa đổi SOAPEncoder để sử dụng XMLEncoder đã sửa đổi của bạn, và sau đó sửa đổi Hoạt động để sử dụng SOAPEncoder đã sửa đổi của bạn, và sau đó biến đổi WebService để sử dụng lớp Hoạt động thay thế của bạn.

Tôi đã dành một vài giờ trên đó, nhưng cần phải tiếp tục. Có thể sẽ mất một hoặc hai ngày.

Bạn có thể sửa chữa dòng XMLEncoder và làm một số bản vá khỉ để sử dụng lớp của riêng bạn.

Tôi cũng sẽ thêm rằng nếu bạn chuyển sang sử dụng RemoteObject / AMF với ColdFusion, giá trị rỗng được chuyển mà không gặp sự cố.


Cập nhật ngày 16/11/2013:

Tôi có thêm một nhận xét gần đây nữa cho nhận xét cuối cùng của tôi về RemoteObject / AMF. Nếu bạn đang sử dụng CF10; sau đó các thuộc tính với một giá trị null trên một đối tượng được loại bỏ khỏi đối tượng phía máy chủ. Vì vậy, bạn phải kiểm tra sự tồn tại của thuộc tính trước khi truy cập nó hoặc bạn sẽ nhận được một lỗi thời gian chạy. Kiểm tra như thế này:

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

Đây là một thay đổi trong hành vi từ CF9; nơi các thuộc tính null sẽ biến thành các chuỗi rỗng.


Chỉnh sửa ngày 12/6/2013

Vì có một câu hỏi về cách null được xử lý ở đây là một ứng dụng mẫu nhanh chóng để chứng minh làm thế nào một chuỗi "null" sẽ liên quan đến từ dành riêng null.

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

Đầu ra dấu vết là:

chuỗi rỗng không bằng từ dành riêng null sử dụng điều kiện! =

null chuỗi không bằng null từ dành riêng bằng cách sử dụng điều kiện ==

null chuỗi không bằng null từ dành riêng bằng cách sử dụng điều kiện ===


125
2018-05-03 15:51



@ Reboog711 Họ của nhân viên theo nghĩa đen là chuỗi "Null" như trong, "Tên tôi là Pat Null" Câu trả lời của bạn không vượt qua họ của nhân viên. Bạn trả lời chỉ giấu một thực tế là "Null" đang bị ép buộc không thích hợp vào khái niệm ngôn ngữ của null bởi phương thức appendChild () như được mô tả bởi Ben Burns. Kết quả là sự thất bại của hệ thống để đối phó với ông hoặc bà Null. - Maxx Daymon
@MaxxDaymon Tôi nghĩ rằng bạn hiểu sai câu trả lời của tôi thực sự là gì. Nó không trình bày một giải pháp; mà đúng hơn là giải thích tại sao vấn đề xảy ra; và trích dẫn mã có liên quan từ Flex Framework. Chỉnh sửa gần đây của tôi có lẽ bị thất lạc; vì nó thảo luận một cách tiếp cận thay thế và không liên quan trực tiếp đến câu hỏi ban đầu. - JeffryHouser
Bạn đang đi đúng hướng, nhưng vào thời điểm đó trong mã content là chuỗi "null"và "null" == null trả về false, để kiểm tra hoạt động như dự định. Thay vào đó, tôi tin rằng vấn đề là sự kết hợp giữa cách XML.appendChild xử lý đối số chuỗi và cách một phần tử XML gốc chỉ chứa chuỗi "null" có thể bị ép buộc thành chữ null. - Ben Burns
@ Reboog711 Hãy nhìn vào fiddle của tôi. "null"! = null` trả về true là hành vi mong muốn ở đây. Nếu ngược lại xảy ra, điều này sẽ loại bỏ chuỗi "null" khỏi quá trình mã hóa, mà trên thực tế sẽ là nguyên nhân của vấn đề. Tuy nhiên, vì thử nghiệm này thành công, bộ mã hóa vẫn tiếp tục, cho đến khi XML.appendChild loại bỏ nó do lỗi cưỡng chế. - Ben Burns
Đừng lo lắng. Nếu bạn muốn xem vấn đề thực sự thêm var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s); vào mẫu mã của bạn. - Ben Burns


Dịch tất cả các ký tự thành các phần tử thực thể hex của chúng. Trong trường hợp này, Null sẽ được chuyển thành &#4E;&#75;&#6C;&#6C;


62
2018-04-30 19:03



Làm ơn đừng làm thế. CDATA được tạo để sử dụng trong trường hợp bạn cần phải thoát toàn bộ khối văn bản. - Ben Burns
Tôi có thể sai, nhưng tôi không nghĩ rằng downvoting chỉ vì nó không của bạn giải pháp là cách nó được cho là hoạt động. Ngoài ra bạn phải ghi nhớ các vấn đề gọi cho một giải pháp heuristic vì không có một cách rõ ràng, như được hiển nhiên bởi sự đa dạng của các giải pháp được đăng. Cuối cùng, hãy nhớ rằng tôi không biết CF, sẽ không phải là một bộ giải mã chỉ bằng văn bản bên trong của <message> <! [CDATA [NULL]]> </ message> đến văn bản bên trong của <message> NULL </ tin nhắn>? Nếu vậy, sau đó là CDATA thực sự là một giải pháp ở tất cả? - doogle
Tôi downvoted vì đây là một anti-pattern. Lỗi trong trường hợp này không có trong CF, nó nằm trong ActionScript. Tuy nhiên, bạn vẫn nêu ra một điểm tốt. Tôi sẽ thêm một bài kiểm tra vào fiddle của tôi để mã hóa CDATA. - Ben Burns


Xâu chuỗi null giá trị trong ActionScript sẽ cho chuỗi "NULL". Nghi ngờ của tôi là ai đó đã quyết định rằng đó là một ý tưởng hay để giải mã chuỗi "NULL" như null, gây ra sự cố mà bạn thấy ở đây - có lẽ vì họ đã đi qua null các đối tượng và nhận được chuỗi trong cơ sở dữ liệu, khi họ không muốn điều đó (vì vậy hãy chắc chắn kiểm tra loại lỗi đó).


49
2018-04-28 20:15



Có, có một số khả năng ở đây sẽ yêu cầu gỡ lỗi nhiều hơn để thu hẹp. 1) WSDL được sử dụng ở đây có biểu cảm đủ để phân biệt giữa "NULL" như một giá trị chuỗi và giá trị null thực tế (hoặc bỏ qua) không? 2) Nếu vậy, là khách hàng mã hóa tên cuối cùng một cách chính xác (như một chuỗi và không phải là một chữ trống) 3) Nếu vậy, là dịch vụ đúng cách giải thích "NULL" như một chuỗi, hoặc ép nó vào một giá trị null? - pimlottc


Là một hack, bạn có thể xem xét việc xử lý đặc biệt ở phía máy khách, chuyển đổi chuỗi 'Null' thành một thứ sẽ không bao giờ xảy ra, ví dụ, XXNULLXX và chuyển đổi lại trên máy chủ.

Nó không phải là đẹp, nhưng nó có thể giải quyết vấn đề cho một trường hợp ranh giới như vậy.


36
2018-04-28 08:43



XXNULLXX cũng có thể là một cái tên. Bạn không biết. Có thể mọi người ở Indonesia không có họ và sử dụng biến thể XXX làm họ của họ khi được yêu cầu. - gb.
Hay, yanno, luôn có CDATA ... - Ben Burns
Cùng một khái niệm, nhưng cập nhật tất cả các tên trong cơ sở dữ liệu và lời nói đầu sau đó với một số ký tự (1Null, 1Smith). Tắt ký tự đó trong ứng dụng khách. Tất nhiên điều này có thể là công việc nhỏ hơn so với giải pháp của Reboog. - bobpaul
@BenBurns Yeah, nhưng nếu tôi muốn đặt tên cho con tôi &#78;&#117;&#108;&#108;? - Sirens
@Sirens Đó không phải là vấn đề. Nếu tên của tôi là "<& quot;>", thì tôi hy vọng nó sẽ được thoát đúng cách & quot; & lt; & amp; quot; & gt; & quot ;, không cần phải nói. Vấn đề thực sự là với một ứng dụng hoạt động như thể nó sử dụng một danh sách đen cho tên. - Mr Lister


Vâng, tôi đoán rằng Flex 'thực hiện của SOAP Encoder dường như serialize null giá trị không chính xác. Tuần tự hóa chúng như là một String Null không có vẻ là một giải pháp tốt. Phiên bản chính thức chính xác có vẻ là để vượt qua một giá trị null như:

<childtag2 xsi:nil="true" />

Vì vậy, giá trị của "Null" sẽ không có gì khác hơn là một chuỗi hợp lệ, đó là chính xác những gì bạn đang tìm kiếm.

Tôi đoán việc sửa lỗi này trong Apache Flex không quá khó để thực hiện. Tôi khuyên bạn nên mở một vấn đề Jira hoặc liên hệ với những người trong danh sách gửi thư apache-flex. Tuy nhiên điều này sẽ chỉ sửa chữa phía khách hàng. Tôi không thể nói nếu ColdFusion sẽ có thể làm việc với các giá trị null được mã hóa theo cách này.

Xem thêm bài đăng trên blog của Radu Cotescu Cách gửi các giá trị null trong các yêu cầu soapUI.


30
2017-07-17 07:56



Có thông tin tốt ở đây, vì vậy tôi sẽ không downvote, nhưng tôi figured nó có giá trị một bình luận. Theo mặc định, XMLEncoder.as sẽ thực sự mã hóa một sự thật null giá trị đúng, bằng cách thiết lập xsi:nil="true" trên phần tử. Vấn đề thực sự dường như là cách ActionScript XML nhập chính nó (không phải bộ mã hóa) xử lý chuỗi "null". - Ben Burns


Đó là một kludge, nhưng giả sử có độ dài tối thiểu cho SEARCHSTRING, ví dụ 2 ký tự, substring các SEARCHSTRING tham số ở ký tự thứ hai và chuyển nó thành hai tham số thay thế: SEARCHSTRING1 ("Nu") và SEARCHSTRING2 ("ll").  Concatenate chúng trở lại với nhau khi thực hiện truy vấn tới cơ sở dữ liệu.


21
2018-04-28 19:48



CDATA đã được thêm vào thông số XML để tránh các loại kludge này. - Ben Burns
Không cần phải thoát khỏi "Null" với CDATA, không có thứ như một từ khóa null trong XML. - eckes
Đồng ý với @eckes. Tôi không hiểu tại sao có tất cả những điều này nói về CDATA. CDATA chỉ hữu dụng để thoát khỏi các ký tự có ý nghĩa đặc biệt trong XML. không: n, u, l có ngữ nghĩa đặc biệt trong XML. "NULL" và "<! [CDATA [NULL]]>" giống hệt với trình phân tích cú pháp XML. - jasonkarns
@jasonkarns - Tôi đồng ý 100% rằng Nên không có gì đặc biệt về nút chuỗi / văn bản NULL, nhưng để trở thành pedantic, <blah>null</blah> và <blah><![CDATA[null]]>không giống với một trình phân tích cú pháp XML. Họ Nên tạo ra cùng một kết quả, tuy nhiên luồng logic để xử lý chúng là khác nhau. Đó là hiệu ứng mà chúng tôi đang khai thác như một giải pháp cho lỗi trong triển khai thực hiện XML flex. Tôi ủng hộ điều này trên các phương pháp khác vì nó bảo toàn khả năng đọc của văn bản và không có tác dụng phụ đối với các trình phân tích cú pháp khác. - Ben Burns