2010-02-15 2 views
0

이것은 제가 여기있는 아주 이상한 상황입니다. 몇 달 동안 백엔드 SOAP 서비스와 상호 작용하는 코드를 사용했습니다. 제대로 작동합니다. 나는 다른 프로젝트에서 그것을 시도했다. (swc 라이브러리로 먼저 시도한 다음, 잘라내어 붙여 넣기 만하면된다.) 그리고 그냥 작동하지 않는다.하나의 Flex 프로젝트에서 동일한 SOAP 요청이 작동하고 다른 프로젝트에서는 작동하지 않는 이유는 무엇입니까?

원래의 flex 프로젝트에서 똑같은 코드를 사용하여 동일한 백엔드 서비스에 연결하면 모든 것이 정상적으로 작동합니다. 새 프로젝트에서는 간단한 문서 리터럴 래퍼를 params (실제 매개 변수가 없음)로 사용하는 작업을 호출 할 수 있습니다. 그러나 작업에 문서 리터럴 래퍼 내부에 복잡한 매개 변수가있는 경우이 새 프로젝트에서 실패합니다. 여기

var service:WebService = new WebService(); 
service.wsdl = wsdlURL; 
var operation:AbstractOperation = service.getOperation("getUsers"); 

var param:XML = <GetUsersRequest/> 
param.setNamespace(myNameSpace); 

operation.send(param); 

내가 다운이 하나 트랙을 시도했던 몇 가지 있습니다 : 여기

var service:WebService = new WebService(); 
service.wsdl = wsdlURL; 
var operation:AbstractOperation = service.getOperation("addNewUser"); 

var param:XML = <AddNewUserRequest/> 
param.setNamespace(myNameSpace); 

param.user.username(username); 
param.user.email(email); 

operation.send(param); 

을 그리고 새 프로젝트에서 작업 할 샘플입니다 : 여기에 실패 샘플입니다 :

- 두 프로젝트에서 파이어 버그의 게시물을 검토했는데 차이가 보이지 않습니다. 두 프로젝트에서 정확히 동일한 SOAP 요청을 생성하는 것으로 보입니다 (예상 한대로) - 요청이 SOAPui를 사용하여 직접 쿼리

org.apache.cxf.interceptor.Fault :

백 엔드 서비스가 여기에 아파치 CXF의 웹 서비스이며, 웹 서비스가 생성하는 오류의 샘플입니다 찾을 요소 {http://www.w3.org/2001/XMLSchema} 사용자 만 RPC/리터럴 부분을 일치 찾을 수 없습니다

내가 아는 모든 것을 사용자가 http://www.w3.org/2001/XMLSchema 네임 스페이스에 있어야 믿고 날 리드 -가 아니라에서 내가 여기에 키 코드가 하나 개의 프로젝트에서 작동한다는 것입니다 생각 -하고 정직하게 다른. 그것은 XML 설정 일 수 있습니까? ignoreWhitespace와 같은 정적 인 것 중 하나? 나는 주위 사람들을 변화시키면서 놀았습니다. 운이 없었습니다.

아이디어가 있습니까? 이것은 나를 미치게하고있다! !!

는 UPDATE :

나는이 아래를 좁혀 : 새 프로젝트는이 같은 헤더를 생성합니다

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

이유 :

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

및 작동 한이 생성 플렉스 & 플렉스 빌더의 정확한 동일 버전의 차이점은 무엇입니까? 작동하는 것은 명백합니다 (xmlns : xsd = "http://www.w3.org/2001/XMLSchema") - 웹 서비스는 xsd 네임 스페이스에있는 요청의 모든 것을 넣는 요청을 거부하는 것이 옳습니다.

답변

2

대신 xmlns:xsd="http://www.w3.org/2001/XMLSchema"의 SOAP 봉투에 xmlns="http://www.w3.org/2001/XMLSchema"를 추가하는 것 이유입니다. 깨진 프로젝트의 어느 시점에서, xmlns="http://www.w3.org/2001/XMLSchema"을 정의하는 rpc.xml.SchemaManager 클래스에 xsd를 가져 왔으며 SchemaConstants의 기본 정의를 덮어 씁니다.

사용중인 모든 xsds를 확인하고 xmlns="http://www.w3.org/2001/XMLSchema"이 포함되어 있지 않은지 확인하십시오.

+1

당신은 분명히 매우 현명하고 강력한 닌자 프로그래머입니다. 당신의 기술은 강하고 당신의 힘은 무한합니다. 나는 fltron을하기 위해 벗어났다. - flex가 어쨌든 적합하다고 생각하는 유일한 방법이다.) –

1

요청을 XML로 하드 코딩하고 있으며 사용자 지정 네임 스페이스에 접두사가 없다고 가정하므로 헤더에 선언 된 XSD의 기본 네임 스페이스와 충돌합니다. 왜 다른 헤더를 얻는 지 모르지만 다른 버전의 SDK로 프로젝트를 컴파일하고있는 것입니다.

몇 가지

는 시도 :

  • 를 SOAP 스택 버그 수정은 거의 모든 버전에 가서, 당신이 두 프로젝트 (최신 당신이 멀리로 얻을 수 컴파일하기 위해 SDK를 사용하고 있는지 확인)

  • 사용하여, 네임 스페이스에 대한 명시 적 접두사를 설정합니다 :

    var myNameSpace:NameSpace = new NameSpace("my","http://something.com/foo/ns");

  • Inste 과 같이, 일반 AS3 개체로 구축하는 XML 요청을 구축하는 광고 :

    var request:Object = {GetUsersRequest: {parm1: foo, parm2:bar }};

    ... 그리고 플렉스 당신을 위해 모든 인코딩을 할 수 있습니다. 수많은 사람들이 손으로 만든 XML 요청 대신 Flex SOAP 스택을 AS3 객체와 잘 연동시키는 데 많은 시간을 할애 했으므로 왜 SDK가 요청을 작성하는 작업을하지 않습니까? 즉,이 rpc.xml.SchemaConstants 클래스에 정의 어떻게 때문에

관련 문제