flex ActionScript 3에서 "Null"(실제 성!)을 SOAP 웹 서비스에 전달하는 방법은 무엇입니까?




coldfusion wsdl (8)

성이 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 입니다.

나는 다음을 사용하고있다.

  • WSDL (SOAP)
  • 플렉스 3.5
  • ActionScript 3
  • ColdFusion 8

ColdFusion 페이지에서 객체로 webservice를 호출 할 때 오류 발생 하지 않습니다 .


해킹으로 'Null'문자열을 절대로 발생하지 않을 것으로 예를 들어 XXNULLXX로 변환하고 서버에서 다시 변환하여 클라이언트 측에서 특별한 처리를 고려할 수 있습니다.

그것은 꽤 아니지만 그런 경계 사건에 대한 문제를 해결할 수 있습니다.


모든 문자를 16 진수로 변환합니다. 이 경우 Null&#4E;&#75;&#6C;&#6C; 로 변환됩니다 &#4E;&#75;&#6C;&#6C;


xkcd 노트 에서 Bobby Tables 웹 사이트ColdFusion 비롯한 다양한 언어로 된 SQL 쿼리의 사용자 데이터 (이 경우 "Null"문자열)의 부적절한 해석을 피하기위한 좋은 조언을 제공합니다.

문제의 근원이라는 것이 명확하지 않으며, 첫 번째 해답 (구조에 매개 변수를 포함)에 대한 해답에 언급 된 해답을 감안할 때 다른 것으로 생각 될 수 있습니다.


Flex의 SOAP 인코더에 문제가있을 수 있습니다. Flex 애플리케이션에서 SOAP 인코더를 확장하고 프로그램을 디버그하여 null 값이 처리되는 방식을 확인하십시오. 내 생각 엔 NaN (숫자가 아님)으로 전달됩니다. 이것은 SOAP 메시지 비 정렬 프로세스를 언젠가 엉망으로 만들 것입니다 (특히 JBoss 5 서버에서 ...). SOAP 인코더를 확장하고 NaN이 처리되는 방식을 명시 적으로 확인한 것을 기억합니다.

(참고로, 직원 ID가 Null 인 경우 유용한 작업을 수행 할 것으로 예상됩니까?이 작업은 유효성 검사가 아닌가요? 요구 사항을 거의 알지 못하기 때문에 잘못 될 수 있습니다 ...)


추적

처음에 이것은 null 이 강제로 "null" 강제 변환되는 버그라고 생각하고 "null" == null 의 테스트가 통과했습니다. 그렇지 않습니다. 나는 가깝지만 아주 아주 잘못되었습니다. 미안합니다!

그 이후 로 wonderfl.net에 많은 재미mx.rpc.xml.* 의 코드를 추적했습니다. XMLEncoder 번째 줄의 XMLEncoder (3.5 소스에서), setValue 에서 모든 XMLEncoding은

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

그것은 본질적으로 다음과 같습니다 :

currentChild.appendChild("null");

원래 코드에 따라이 코드는 빈 XML 요소를 반환합니다. 하지만 왜?

원인

댓글 작성자 Justin Mclean에 따르면 버그 보고서 FLEX-33664 에 따르면 다음과 같은 원인이 있습니다 (이 사실을 확인하는 마지막 두 테스트 참조).

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 값은 요소의 전체 텍스트를 이스케이프 처리 할 때 선호됩니다. 가장 큰 이유는 인간의 가독성을 유지한다는 것입니다.


글쎄, 난 플렉스 'SOAP 인코더의 구현을 null 값을 잘못 serialize하는 것으로 보인다. 문자열 널로 직렬화하는 것은 좋은 해결책이 아닌 것 같습니다. 공식적으로 올바른 버전은 null 값을 다음과 같이 전달하는 것 같습니다.

<childtag2 xsi:nil="true" />

따라서 "Null"의 값은 유효한 문자열이 아닌 다른 문자열 일 것입니다.

아파치 플렉스에서이 문제를 해결하는 것이 어렵지는 않을 것이라고 생각한다. Jira 문제를 열거 나 apache-flex 메일 링리스트에 연락하는 것이 좋습니다. 그러나 이것은 클라이언트 쪽만 고칠 것입니다. ColdFusion이 이러한 방식으로 인코딩 된 null 값으로 작업 할 수 있는지 말할 수 없습니다.

Radu Cotescu의 블로그 게시물 soapUI 요청에 null 값을 보내는 방법을 참조하십시오.


그것은 kludge입니다. 그러나 SEARCHSTRING 의 최소 ​​길이 (예 : 2 자)가 있다고 가정하고 SEARCHSTRING 매개 변수를 두 번째 문자에서 substringSEARCHSTRING 다음 SEARCHSTRING1 ("Nu")SEARCHSTRING2 ("ll"). 대신 두 개의 매개 변수로 전달하십시오 SEARCHSTRING2 ("ll"). 데이터베이스에 쿼리를 실행할 때 다시 Concatenate 하십시오.


ActionScript 에서 null 값을 문자열로 지정하면 "NULL" 문자열이 반환됩니다. 내의 의혹은 누군가가 문자열 "NULL"null 로 디코딩하여 여기에 표시된 파손을 일으키는 것이 좋습니다. 이는 아마도 null 객체를 전달하고 데이터베이스에서 문자열을 가져 오는 것이므로 그들은 그것을 원하지 않았다. (그런 종류의 버그도 확인해야한다.)