Flexのクラスとサーバサイドのクラスのマッピングがうまくいかないケース

はい、ものすごく久しぶりの更新です。
Flexでサーバサイドとの連携を行う場合には、プリミティブ型を使う以外に
Flex側のクラスとサーバサイドのクラスをマッピングさせることがよくあります。
で、このマッピングでちょっとはまってしまったのでメモです。

今回のメモはFlex側のアプリケーションの問題なので、
サーバサイドのアーキテクチャは関係ありません。
(サーバサイドがamfphpでもPyAMFでもBlazeDSでもLSDSでも)

例えばFlex側でこんなクラスhoge.Hoge.asを書いたとします。

 
package hoge {
	[RemoteClass(alias = "hoge.Hoge")]
	public class Hoge {
		public var name:String;
		public var value:String;
	}
}
 
そして、サーバサイドにはhoge.Hogeクラスのオブジェクト配列を返すHogeService.getHogeが実装されているとします。
で、サーバサイドのServiceをRemoteObjectとかで呼んで、結果をDataGridに格納するとします。
例えばこんなFlexアプリケーションhogeAppli.mxmlがあるとします。
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
	<![CDATA[
		import mx.rpc.events.ResultEvent;
		private function getResult(event:ResultEvent):void {
			dgHoge.dataProvider = event.result;
		}
	]]>
</mx:Script>
	<mx:RemoteObject id="remoteObject" destination="default" source="HogeService" result="{getResult(event)}"/>
	<mx:VBox x="0" y="0">
		<mx:DataGrid id="dgHoge">
			<mx:columns>
				<mx:DataGridColumn headerText="Name" dataField="name"/>
				<mx:DataGridColumn headerText="Value" dataField="value"/>
			</mx:columns>
		</mx:DataGrid>
		<mx:Button id="btnGetHoge" label="getHoge" click="{remoteObject.getHoge()}"/>
	</mx:VBox>
 
</mx:Application>
 

さて、btnGetHogeがクリックされて、HogeServiceのgetHogeが実行された後
getResultメソッドの引数eventのresultに格納されているのは、何のクラスのオブジェクト配列でしょう。
hoge.Hogeクラスが定義されていてマッピングも定義されているのでhoge.Hogeクラスのオブジェクト配列になりそうなものですけど
実際にはObjectクラスのオブジェクト配列になります。
どうしてこういうことになるのかというと、
Flexのソースツリーの中にhoge.Hoge.asが含まれていたとしても
アプリケーション(この場合はhogeAppli.mxml)からhoge.Hogeクラスが参照されない限りは
hoge.Hoge.asはクラスマッピングの対象にならないようです。
FlexBuilderでは、hoge.Hoge.asにシンタックスの間違いがあってコンパイルが通らないようなソースであっても
ビルドが通ってしまいますから、そもそもコンパイルの対象にならないのかもしれませんね。

Category: Flex | Posted on: 2008/04/25 18:20 | Viewed: 3889

Comments

2008/10/01, 09:08 null wrote:

型指定をしても
dgHoge.dataProvider = event.result as hoge.Hoge;
駄目なんですか?

2008/10/17, 10:41 delfino wrote:

遅レスでごめんなさい。
型指定した場合は、アプリケーションからhoge.Hogeが参照されるので、大丈夫だったと思います。

Add Comment

:

:
:

TrackBacks

このエントリにトラックバックはありません

TrackBack URL

http://www.azul.systems-noel.jp/trackback/item_79.html