无法从Flex中的Java Web服务响应中检索值

时间:2011-09-21 13:57:36

标签: java flex web-services actionscript

我试图从flex mxml / action脚本中读取来自java web服务的数据,好像是调用ie请求/响应成功但是当无法从响应中读取值时,请帮助MXML代码如下:

Unable to print the value from :
var outA:OutputA_type = ccxc.OutputA;
 trace(outA);
var aaa:String = outA.toString();
Alert.show(aaa)

它打印为[Object OutputA)_Type]但不是所需的值。但是在flex builder测试连接中,我也看到了正确的值/响应。

<?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"
               xmlns:number1="services.number1.*"
               xmlns:testws="services.testws.*"
               minWidth="955" minHeight="850" creationComplete="initApp()">


    <!-- Styles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

    <fx:Style source="Styles.css"/>

    <!-- Script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.collections.ArrayList;
            import mx.controls.Alert;
            import mx.events.CalendarLayoutChangeEvent;
            import mx.rpc.AsyncToken;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.utils.ObjectUtil;

            import services.testws.Testws;

            import valueObjects.OutputA_type;
            import valueObjects.Parameters_type;
            import valueObjects.TestParameters;
            import valueObjects.TestResult_type;

            private function initApp():void  {

                var testWebS:Testws = new Testws();
                var testParam:TestParameters = new TestParameters();
                testParam.ParamA = 2;
                testParam.ParamB = 3;

                var token:AsyncToken = testWebS.test(testParam);

                token.addResponder(new mx.rpc.Responder(result, fault));
            }

            private function result(event:ResultEvent) : void {
                trace(event.result);
                var strData:TestResult_type = event.result as  TestResult_type;
                var ccxc:Parameters_type = strData.Parameters;
                var outA:OutputA_type = ccxc.OutputA;
                trace(outA);
                var aaa:String = outA.toString();

                Alert.show(aaa.toString());

            }

            public function fault(event : FaultEvent) : void {
                Alert.show("Failed Condition Fault Exception");
            }

        ]]>
    </fx:Script>

    <!-- Declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

    <fx:Declarations>

    </fx:Declarations>

    <!-- UI components ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

    <s:Label x="10" y="34" 
             width="690" height="40" 
             text="Employee Portal: Vehicle Request Form"
             styleName="titleHeader"/>

    <s:Form x="10" y="70">
        <s:FormItem label="Input a:">
            <s:TextInput id="a"/>
        </s:FormItem>
        <s:FormItem label="Input b:">
            <s:TextInput id="b"/>
        </s:FormItem>
        <s:FormItem>
            <s:Button id="submitButton" 
                      label="Submit Request" click="submitButton_clickHandler(event)"/>
        </s:FormItem>
    </s:Form>

</s:Application>


SOAP-UI Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://tempuri.org/testws">
   <soapenv:Header/>
   <soapenv:Body>
      <tes:test>
         <tes:parameters>
            <!--Optional:-->
            <tes:ParamA>3</tes:ParamA>
            <!--Optional:-->
            <tes:ParamB>1</tes:ParamB>
         </tes:parameters>
      </tes:test>
   </soapenv:Body>
</soapenv:Envelope>

SOAP-UI Response:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <m:testResponse xmlns:m="http://tempuri.org/testws">
         <m:testResult>
            <axis2ns794:Parameters xmlns:axis2ns794="http://tempuri.org/testws">
               <axis2ns795:OutputA description="" xmlns:axis2ns795="http://tempuri.org/testws">1</axis2ns795:OutputA>
            </axis2ns794:Parameters>
         </m:testResult>
      </m:testResponse>
   </soapenv:Body>
</soapenv:Envelope>

2 个答案:

答案 0 :(得分:0)

private function result(event:ResultEvent) : void { 
                trace(event.result); 
                var strData:TestResult_type = event.result as  TestResult_type; 
                var ccxc:Parameters_type = strData.Parameters; 
                var outA:OutputA_type = ccxc.OutputA; 
                trace(outA); 
                var aaa:String = outA.toString(); 

                Alert.show(aaa.toString()); 

} 
  1. 您在执行trace(event.result)
  2. 时获得的回复是什么?
  3. 记下这个strData,记下你得到的内容。

答案 1 :(得分:0)

而不是使用

 private function result(event:ResultEvent) : void {
            trace(event.result);
            var strData:TestResult_type = event.result as  TestResult_type;
            var ccxc:Parameters_type = strData.Parameters;
            var outA:OutputA_type = ccxc.OutputA;
            trace(outA);
            var aaa:String = outA.toString();

            Alert.show(aaa.toString());

        }

尝试使用Object而不是直接投射它。

var retObj:Object = event.result;
var strData:TestResult_type = new TestResult_type();
strData.firstProperty = retObj.firstProperty;
strData.secondProperty = retObj.secondProperty;

我认为我之前遇到过这样的问题,你不能像在java端那样将返回的对象分配给flex对象。如果这样可行,则必须遍历每个event.result对象,并通过setter设置对象的所有属性。