2016-09-26 5 views
0

私はFlex初心者です。WebAPIサービスから情報を受け取り、表示するMXMLアプリケーションを作成しています。WebAPIからFlexへのオブジェクトの返却

これまでは単純な文字列でこれを実現しましたが、複雑なオブジェクトを返そうとするとnullが返されます。コードはほとんどのFlash 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: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> 

はここに私のコードですが、それは非常に簡単なフォームです。 "Survey"クラスはGenerate Service Callウィザードで生成され、同じウィザードで定義されているGUID、Title、Questionオブジェクトのリストの3つのプロパティが含まれています。

コードを実行すると、エラーは発生せず、ネットワークモニタに応じて呼び出しが正常に行われ、データが返されます。しかし、assignSurveyResultでコードを破棄してサーベイオブジェクトをチェックすると、結果はnullになります。

サーベイタイトルのみを文字列として返すWebAPI呼び出しを使用するようにコードを変更すると、正常に動作します。それは動作しないオブジェクトだけであるように見えます。

私は間違っていますか?

答えて

0

Flexのソースコードをトレースしたところ、解決策が見つかりました。 Flash Builderで生成されたクライアントプロキシコードは自分のXMLデータをJSONとして非直列化するように設定されていたため、デシリアライズされたデータはオブジェクトに変換できない "http://www.w3.org/2001/XMLSchema-instance"と表示されました。

サービスコールの生成ウィザードを使用すると、パッケージが生成されます。私の場合は「services.acrs_surveys」です。

private static var serializer0:JSONSerializationFilter = new JSONSerializationFilter(); 
private static var serializer1:XMLSerializationFilter = new XMLSerializationFilter(); 

シリアライザが使用されるこのクラスのセットのコンストラクタ:operation.serializationFilterであること

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); 

注このパッケージに「_Super_Acrs_surveys()」ヘッダ内の2つのシリアライザを宣言するクラス、ありますこの操作のデータが実際にXMLであっても、JSONシリアライザであるserializer0に設定します。ウィザードはデータタイプを正しく検出しなかったため、問題が発生しているようです。

シリアライザをserializer1に変更しました。これで私のコードが動作します。

興味深いことに、XMLで文字列を返す操作が正しく検出されたため、私の質問に記載されているように動作しました。

関連する問題