질문자 :bill
성이 Null인 직원이 있습니다. 직원 조회 응용 프로그램은 해당 성이 검색어로 사용될 때 종료됩니다(지금은 꽤 자주 발생함). 수신된 오류(Fiddler에게 감사드립니다!)는 다음과 같습니다.
<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
입니다.
나는 사용하고 있습니다 :
ColdFusion 페이지에서 웹 서비스를 객체로 호출할 때는 오류 가 발생하지 않습니다.
추적
null
"null"
강제 변환되고 "null" == null
테스트가 통과하는 강제 버그라고 생각했습니다. 그렇지 않다. 나는 가까웠지만 매우, 매우 틀렸다. 미안합니다!
나는 그 이후 로 wonderfl.net에서 mx.rpc.xml.*
의 코드를 추적했습니다. XMLEncoder
(3.5 소스)의 1795행 setValue
에서 모든 XMLEncoding은 다음과 같이 요약됩니다.
currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));
본질적으로 다음과 같습니다.
currentChild.appendChild("null");
내 원래 바이올린에 따르면 이 코드는 빈 XML 요소를 반환합니다. 하지만 왜?
원인
버그 보고서 FLEX-33664 에 대한 주석 작성자 Justin Mclean에 따르면 다음이 범인입니다(이를 확인하는 내 바이올린의 마지막 두 테스트 참조).
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 요소로 변환한 다음 null 리터럴에 대해 해당 요소를 테스트합니다. 이것은 약한 동등성 테스트이므로 null을 포함하는 XML이 null 유형으로 강제 변환되거나 null 유형이 "null" 문자열을 포함하는 루트 xml 요소로 강제 변환되고 테스트는 틀림없이 실패해야 하는 곳에서 통과합니다. 한 가지 수정 사항은 "nullness"에 대해 XML(또는 실제로는 무엇이든)을 확인할 때 항상 엄격한 동등성 테스트를 사용하는 것입니다.
해결책
모든 ActionScript 버전에서 이 버그를 수정하지 않고 생각할 수 있는 유일한 합리적인 해결 방법은 "null" 필드를 테스트
하고 CDATA 값 으로 이스케이프하는 것입니다. CDATA 값은 인코딩/디코딩 문제를 일으킬 수 있는 전체 텍스트 값을 변경하는 가장 적절한 방법입니다. 예를 들어 16진수 인코딩은 개별 문자를 의미합니다. CDATA 값은 요소의 전체 텍스트를 이스케이프할 때 선호됩니다. 가장 큰 이유는 사람의 가독성을 유지하기 때문입니다.
Ben Burnsxkcd 메모 에서 Bobby Tables 웹 사이트 에는 ColdFusion을 포함한 다양한 언어의 SQL 쿼리에서 사용자 데이터의 부적절한 해석(이 경우 문자열 "Null")을 피하기 위한 좋은 조언이 있습니다.
이것이 문제의 원인인지는 질문에서 명확하지 않으며 첫 번째 답변에 대한 주석에 언급된 솔루션(구조에 매개변수 포함)을 고려할 때 다른 문제였을 가능성이 높습니다.
Alex Dupuy문제는 Flex의 SOAP 인코더에 있을 수 있습니다. Flex 애플리케이션에서 SOAP 인코더를 확장하고 프로그램을 디버그하여 null 값이 처리되는 방식을 확인하십시오.
내 생각에는 NaN (숫자가 아님)으로 전달되었습니다. 이것은 언젠가 SOAP 메시지 비정렬화 프로세스를 엉망으로 만들 것입니다(특히 JBoss 5 서버에서...). SOAP 인코더를 확장하고 NaN이 처리되는 방식에 대한 명시적 검사를 수행한 것을 기억합니다.
uncaught_exceptions@doc_180은 숫자에 중점을 둔 것을 제외하고 올바른 개념을 가지고 있었지만 원본 포스터는 문자열에 문제가 있었습니다.
mx.rpc.xml.XMLEncoder
파일을 변경하는 것입니다. 121번째 줄입니다.
if (content != null) result += content;
(Flex 4.5.1 SDK를 살펴보았는데, 다른 버전에서는 줄 번호가 다를 수 있습니다.)
기본적으로 '콘텐츠가 null'이기 때문에 유효성 검사가 실패하므로 발신 SOAP 패킷에 인수가 추가되지 않습니다. 따라서 누락된 매개변수 오류가 발생합니다.
유효성 검사를 제거하려면 이 클래스를 확장해야 합니다. 그런 다음 수정된 XMLEncoder를 사용하도록 SOAPEncoder를 수정한 다음 수정된 SOAPEncoder를 사용하도록 Operation을 수정한 다음 대체 Operation 클래스를 사용하도록 WebService를 수정하여 체인 위로 큰 눈덩이가 생깁니다.
나는 그것에 대해 몇 시간을 보냈지 만 계속해야합니다. 아마 하루나 이틀이 걸릴 것입니다.
XMLEncoder 라인을 수정하고 자신의 클래스를 사용하기 위해 일부 원숭이 패치를 수행할 수 있습니다.
또한 ColdFusion과 함께 RemoteObject/AMF를 사용하도록 전환하면 null이 문제 없이 전달된다는 점도 추가하겠습니다.
2013년 11월 16일 업데이트 :
RemoteObject/AMF에 대한 마지막 의견에 최근에 하나 더 추가했습니다. ColdFusion 10을 사용하는 경우 그런 다음 개체에 null 값이 있는 속성이 서버 측 개체에서 제거됩니다. 따라서 액세스하기 전에 속성이 있는지 확인해야 합니다. 그렇지 않으면 런타임 오류가 발생합니다.
다음과 같이 확인하십시오.
<cfif (structKeyExists(arguments.myObject,'propertyName')> <!--- no property code ---> <cfelse> <!--- handle property normally ---> </cfif>
이것은 ColdFusion 9에서 변경된 동작입니다. 여기서 null 속성은 빈 문자열로 바뀝니다.
2013년 12월 6일 수정
null을 처리하는 방법에 대한 질문이 있었기 때문에 "null" 문자열이 예약어 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 (eg, services, value objects) here --> </fx:Declarations> </s:Application>
추적 출력은 다음과 같습니다.
null 문자열은 != 조건을 사용하는 null 예약어와 같지 않습니다.
null 문자열은 == 조건을 사용하는 null 예약어와 같지 않습니다.
null 문자열은 === 조건을 사용하는 null 예약어와 같지 않습니다.
JeffryHouser모든 문자를 해당하는 16진수 엔티티로 변환합니다. 이 경우 Null
은 E;KC;C;
doogleActionScript null
값을 문자열화하면 문자열 "NULL"
이 제공됩니다. "NULL"
을 null
로 디코딩하는 것이 좋은 생각이라고 결정했다는 것입니다. 여기에서 볼 수 있는 손상이 발생합니다. 아마도 null
객체를 전달하고 데이터베이스에서 문자열을 가져오기 때문일 것입니다. 그들은 그것을 원하지 않았습니다(그래서 그런 종류의 버그도 확인해야 합니다).
Andrew Aylett해킹으로, 'Null' 문자열을 XXNULLXX와 같이 절대 발생하지 않을 것으로 변환하고 서버에서 다시 변환하는 등 클라이언트 측에서 특별한 처리를 고려할 수 있습니다.
예쁘지는 않지만 이러한 경계의 경우 문제를 해결할 수 있습니다.
Mark글쎄, SOAP 인코더의 Flex 구현이 null 값을 잘못 직렬화하는 것 같습니다. 그것들을 String Null로 직렬화하는 것은 좋은 해결책이 아닌 것 같습니다. 공식적으로 올바른 버전은 다음과 같이 null 값을 전달하는 것 같습니다.
<childtag2 xsi:nil="true" />
따라서 "Null"의 값은 정확히 당신이 찾고 있는 유효한 문자열일 것입니다.
Apache Flex에서 이 문제를 해결하는 것은 그리 어렵지 않을 것입니다. Jira 문제를 열거나 apache-flex 메일링리스트에 문의하는 것이 좋습니다. 그러나 이것은 클라이언트 측에서만 수정됩니다. ColdFusion이 이러한 방식으로 인코딩된 null 값으로 작업할 수 있을지는 장담할 수 없습니다.
Radu Cotescu의 블로그 게시물 soapUI 요청에서 null 값을 보내는 방법 도 참조하세요.
Christofer DutzSEARCHSTRING
에 대한 최소 길이가 있다고 가정하면 예를 들어 2자, SEARCHSTRING
매개변수를 두 번째 문자에 substring
하고 SEARCHSTRING1 ("Nu")
및 SEARCHSTRING2 ("ll").
데이터베이스에 대한 쿼리를 실행할 때 다시 Concatenate
SPitBalls.com출처 : 여기를 클릭하세요
출처 : http:www.stackoverflow.com/questions/4456438/how-to-pass-null-a-real-surname-to-a-soap-web-service-in-actionscript-3