2013-01-13 168 views
2

我的Flex應用程序正確調用Web服務,但不會填充下拉框。如何使用FLEX解析SOAP響應

根據我的研究,問題在於命名空間,但仍不知道如何解決它。

一旦我運行應用程序的下拉框是空的。

我的Java代碼

package com.Services; 

import com.classes.*; 

import javax.jws.WebService; 
import javax.jws.WebMethod; 
import javax.jws.WebResult; 


@WebService (name="Hellos",  
targetNamespace="http://localhost:8081/Mywebservice2/services/Hellos") 
public class Hellos { 

    @WebMethod 
    public @WebResult (name="customers",partName="customers") Customer[] mycustomers() 
    { 
     System.out.println("Retriving customers...."); 
     Customer[] cus = new Customer[2]; 
     cus[0] = new Customer("Jack", 28); 
     cus[1] = new Customer("Ben", 29); 
     return cus; 
    } 
} 

Flex應用程序的網絡監控功能顯示響應如下

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: text/xml;charset=utf-8 
Transfer-Encoding: chunked 
Date: Thu, 10 Jan 2013 04:23:55 GMT 

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
    <mycustomersResponse xmlns="http://Services.com"> 
     <mycustomersReturn> 
      <age>28</age> 
      <name>Jack</name> 
     </mycustomersReturn> 
     <mycustomersReturn> 
      <age>29</age> 
      <name>Ben</name> 
     </mycustomersReturn> 
    </mycustomersResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

我的Flex代碼如下

<fx:Script> 

    <![CDATA[ 
     import mx.controls.Alert; 
     import mx.events.FlexEvent; 

     protected function 
        dropDownList2_creationCompleteHandler(event:FlexEvent):void 
     { 
      mycustomersResult2.token = hellos.mycustomers(); 
     } 

    ]]> 
</fx:Script> 

    <fx:Declarations> 

    <hellos:Hellos id="hellos" fault="Alert.show(event.fault.faultString + '\n' 
      + event.fault.faultDetail)" 
      showBusyCursor="true"/> 

    <s:CallResponder id="mycustomersResult2"/> 

</fx:Declarations> 

<s:FormItem label="Label"> 
    <s:DropDownList id="dropDownList2" 
     creationComplete="dropDownList2_creationCompleteHandler(event)" 
     labelField="age"> 
     <s:AsyncListView list="{mycustomersResult2.lastResult}"/> 
    </s:DropDownList> 
    </s:FormItem> 

當我改變了

<s:AsyncListView list="{mycustomersResult2.lastResult}"/> 

<s:AsyncListView list=" 
       {mycustomersResult2.lastResult.mycustomersResponse.mycustomersReturn}"/> 

它提供了以下錯誤

Error: Unknown Property: 'mycustomersResponse'. 
    at mx.collections::ListCollectionView/http://www.adobe.com/2006/actionscript/flash/proxy::getProperty()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:870] 
    at mx.binding::PropertyWatcher/updateProperty()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:338] 
    at Function/http://adobe.com/AS3/2006/builtin::apply() 
    at mx.binding::Watcher/wrapUpdate()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\Watcher.as:192] 
    at mx.binding::PropertyWatcher/updateParent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:239] 
    at mx.binding::Watcher/updateChildren()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\Watcher.as:138] 
    at mx.binding::PropertyWatcher/updateProperty()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:347] 
    at Function/http://adobe.com/AS3/2006/builtin::apply() 
    at mx.binding::Watcher/wrapUpdate()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\Watcher.as:192] 
    at mx.binding::PropertyWatcher/eventHandler()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:375] 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at mx.rpc::CallResponder/set lastResult() 
    at mx.rpc::CallResponder/result()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\CallResponder.as:120] 
    at mx.rpc::AsyncToken/http://www.adobe.com/2006/flex/mx/internal::applyResult()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncToken.as:239] 
    at mx.rpc.events::ResultEvent/http://www.adobe.com/2006/flex/mx/internal::callTokenResponders()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\events\ResultEvent.as:207] 
    at mx.rpc::AbstractOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractOperation.as:244] 
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:318] 
    at mx.rpc::Responder/result()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\Responder.as:56] 
    at mx.rpc::AsyncRequest/acknowledge()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84] 
    at DirectHTTPMessageResponder/completeHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:451] 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at flash.net::URLLoader/onComplete() 

回答

1

好像與命名空間問題的響應XML格式:

<mycustomersResponse xmlns="http://Services.com"> 

只寫在任何地方y歐代碼:

namespace ns = "http://Services.com"; 
use namespace ns; 

我已經寫了演示與給定的XML:

var xml:XML = <soapenv:Envelope 
     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <mycustomersResponse xmlns="http://Services.com"> 
      <mycustomersReturn> 
       <age>28</age> 
       <name>Jack</name> 
      </mycustomersReturn> 
      <mycustomersReturn> 
       <age>29</age> 
       <name>Ben</name> 
      </mycustomersReturn> 
     </mycustomersResponse> 
    </soapenv:Body> 
    </soapenv:Envelope> 

    namespace ns = "http://Services.com"; 
    use namespace ns; 

    namespace ns_soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
    use namespace ns_soapenv; 

    trace(xml.Body.mycustomersResponse.mycustomersReturn.length()); //output 2 

據分析好。希望這會有所幫助。

+0

我已經複製這兩行之後>>進口mx.events.FlexEvent;但結果仍然相同。 –

+0

儘管我做了更多的研究,並發現問題與命名空間有關,但仍不確定如何解決它。 –

+0

檢查我的補充,有正確的XML解析 –

1

你不必解析它,WebService類爲你做。

<s:WebService result=" soapResultHandler(event) "> 
    <!-- do stuff here --> 
</s:WebService> 

<fx:Script> 
    <![CDATA[ 
     private function soapResultHandler(e:ResultEvent):void { 
      //do stuff to e.result in here 
     } 
    ]]> 
</fx:Script> 

ResultEvent.result對象是將XML自動解析爲單個動態對象。您可以輕鬆地循環查看所需的任何細節。值得注意的是,如果XML文檔的單個級別具有多個相同標記名稱的實例,則會出現ArrayCollection(而不是Array,介意),而不是一系列這些對象。

ResultEvent#result LiveDocs