我是Flex新手,我正在编写一个MXML应用程序,它将从WebAPI服务接收信息并显示它。
到目前为止,我已经设法通过一个简单的字符串来实现这一点,但是如果我尝试返回一个复杂的对象,它将返回null。
这是我的代码,这是一个非常简单的形式:
<?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:acrs_surveys="services.acrs_surveys.*"
xmlns:valueObjects="valueObjects.*"
minWidth="955" minHeight="600">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
protected function button_clickHandler(event:MouseEvent):void
{
GetSurveyResult.token = acrs_surveys.GetSurvey(itemidTextInput.text);
}
protected function button2_clickHandler(event:MouseEvent):void
{
survey.SurveyId = surveyIdTextInput.text;
survey.Title = titleTextInput.text;
}
protected function assignSurveyResult(event:ResultEvent):void
{
survey = event.result as Survey;
}
]]>
</fx:Script>
<fx:Declarations>
<s:CallResponder id="GetSurveyResult" result="assignSurveyResult(event)"/>
<valueObjects:Survey id="survey"/>
<acrs_surveys:Acrs_surveys id="acrs_surveys" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true" />
</fx:Declarations>
<s:Form defaultButton="{button}">
<s:FormItem label="Itemid">
<s:TextInput id="itemidTextInput"/>
</s:FormItem>
<s:Button id="button" label="GetSurvey" click="button_clickHandler(event)"/>
</s:Form>
<s:Form defaultButton="{button2}">
<s:FormHeading label="Survey"/>
<s:FormItem label="Questions">
<s:Label id="QuestionsLabel" text="Questions_type[]"/>
</s:FormItem>
<s:FormItem label="SurveyId">
<s:TextInput id="surveyIdTextInput" text="{survey.SurveyId}"/>
</s:FormItem>
<s:FormItem label="Title">
<s:TextInput id="titleTextInput" text="{survey.Title}"/>
</s:FormItem>
<s:Button id="button2" label="Submit" click="button2_clickHandler(event)"/>
</s:Form>
</s:Application>
代码主要由Flash Builder的向导生成。 “Survey”类由Generate Service Call向导生成,包含三个属性 - GUID,Title和Question对象列表,这些属性也由同一向导定义。
当我运行代码时,不会发生错误,并且根据网络监视器,调用成功并返回数据。但是,当我在assignSurveyResult中破坏代码并检查调查对象时,结果为空。
如果我更改代码以使用仅将调查标题作为字符串返回的WebAPI调用,则它可以正常工作。它似乎只是不起作用的对象。
我做错了什么?
答案 0 :(得分:0)
在追踪Flex源代码后,我找到了解决方案。事实证明,Flash Builder生成的客户端代理代码已经将自己的XML数据反序列化为JSON,结果是反序列化的数据显示为“http://www.w3.org/2001/XMLSchema-instance”,无法转换为对象。
使用Generate Service Call向导时,会生成一个包,在我的例子中称为“services.acrs_surveys”。在这个包中有一个“_Super_Acrs_surveys()”类,它在头文件中声明了两个序列化器:
private static var serializer0:JSONSerializationFilter = new JSONSerializationFilter();
private static var serializer1:XMLSerializationFilter = new XMLSerializationFilter();
此类的构造函数设置将使用哪个序列化程序:
operation = new mx.rpc.http.Operation(null, "GetSurvey");
operation.url = "Get/{itemid}";
operation.method = "GET";
argsArray = new Array("itemid");
operation.argumentNames = argsArray;
operation.serializationFilter = serializer0;
operation.properties = new Object();
operation.properties["urlParamNames"] = ["itemid"];
operation.resultType = valueObjects.Survey;
operations.push(operation);
请注意,operation.serializationFilter
设置为serializer0
,这是JSON序列化程序,即使此操作的数据实际上是XML。看来向导没有正确检测数据类型,因此问题。
我将序列化程序更改为serializer1,现在我的代码正常工作。
有趣的是,只有在XML中返回字符串的操作才被正确检测到,这就是我工作中提到的原因。