2013-01-13 126 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