[Seasar-user:14680] Re: [S2BlazeDS]Array 型からjava.util.List型への変換
山田 祐己
[E-MAIL ADDRESS DELETED]
2008年 6月 13日 (金) 08:10:20 JST
近藤(nobu)さん
お世話になります。山田です。
返信、ありがとうございます。
>この部分ですかね?
>
>> var product:Product = list.getItemAt(i) as Product;
>
>私はS2Flex2を使用していますが、S2Flex2だと上記の部分は必要ですね。
>というのも、Array、ArrayCollectionの要素1つ1つはObjectクラスなの
>で、ObjectクラスのままJava側に転送しようとすると、Flexから送信され
>てきたObjectクラスをJava側のEntityにマッピングできなくなってエラー
>が発生します。BlazeDSはどうなんでしょうね?
はい。そこなのですが、BlazeDSでもEntityにマッピングは自動ではして
貰えない様です。
> srv.setProducts(dg.dataProvider.source);
>
>としてみてください。dg.dataProviderがArrayCollectionであるなら、
>ArrayCollection.sourceはArrayCollection内のデータソース(Array)
>を指します。
近藤さんの、ご提案戴きました「dg.dataProvider.source」と云う記述自体が、
上手く認識せずに例外が発生しました。
ただ、自動でentityまでマッピングと云うのは、私の過度の期待でしたので、
ループでCastしてからメソッドを呼ぶように致します。
どうもありがとうございます。
以上
山田 祐己(Yuki Yamada)
E-Mail [E-MAIL ADDRESS DELETED]
--nobu<[E-MAIL ADDRESS DELETED]> wrote:
>近藤(nobu)です。
>
>> 上記例ではscriptを使用して、dataProviderをcastし直していますが、
>
>この部分ですかね?
>
>> var product:Product = list.getItemAt(i) as Product;
>
>私はS2Flex2を使用していますが、S2Flex2だと上記の部分は必要ですね。
>というのも、Array、ArrayCollectionの要素1つ1つはObjectクラスなの
>で、ObjectクラスのままJava側に転送しようとすると、Flexから送信され
>てきたObjectクラスをJava側のEntityにマッピングできなくなってエラー
>が発生します。BlazeDSはどうなんでしょうね?
>
>BlazeDSがマッピングを賢くしてくれるのであれば、
>
>> for (var i:int = 0; i < list.length; i++) {
>> var product:Product = list.getItemAt(i) as Product;
>> condition.push(product);
>> // はじめは、ここで1entity毎に実行していた。
>> // srv.update(product);
>> }
>> srv.setProducts(condition);
>
>この部分を、
>
> srv.setProducts(dg.dataProvider.source);
>
>としてみてください。dg.dataProviderがArrayCollectionであるなら、
>ArrayCollection.sourceはArrayCollection内のデータソース(Array)
>を指します。
>これでうまくいかなかった場合は、やはり要素1つ1つをキャストして
>配列に詰め直す必要がありそうです。
>
>いかがでしょうか?
>
>
>山田 祐己 さんは書きました:
>> 近藤(nobu)さん
>>
>> お世話になります。
>> 山田です。
>>
>> S2BlazeDSのサンプル「remoteobjectmain.mxml」を以下の様に修正したら
>> 上手くいきました。
>>
>> ------------------------------------------------
>> ○Flex側ソース
>> <?xml version="1.0" encoding="UTF-8"?>
>> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
>> backgroundColor="#FFFFFF">
>>
>> <mx:RemoteObject id="srv" destination="productService"/>
>>
>> <mx:DataGrid id="dg" dataProvider="{srv.getProducts.lastResult}"
>> width="100%" height="100%" editable="true" />
>>
>> <mx:HBox>
>> <mx:Button label="Get Data" click="srv.getProducts()"/>
>> <!--
>> この記述では、java側にArrayCollection(Object)で渡ってしまう。
>> <mx:Button label="Save Data" click="srv.setProducts(dg.dataProvider)"/>
>> -->
>> <mx:Button label="Save Data" click="setProducts()"/>
>> </mx:HBox>
>>
>> <mx:Script>
>> <![CDATA[
>> import flex.samples.entity.Product;
>> import mx.collections.IList;
>> import mx.controls.Alert;
>> private function setProducts():void {
>> var list:IList = IList(dg.dataProvider);
>> var condition:Array = new Array();
>>
>> for (var i:int = 0; i < list.length; i++) {
>> var product:Product = list.getItemAt(i) as Product;
>> condition.push(product);
>> // はじめは、ここで1entity毎に実行していた。
>> // srv.update(product);
>> }
>> srv.setProducts(condition);
>> Alert.show('更新を完了しました', '完了');
>> }
>> ]]>
>> </mx:Script>
>> </mx:Application>
>>
>> ○java側ソース
>> /**
>> * プロダクトのリストを登録(予定)
>> *
>> */
>> public void setProducts(List<Product> products) {
>> for(Product product:products) {
>> log.debug("product.name:" + product.name);
>> }
>>
>> }
>> ------------------------------------------------
>> ここまで
>>
>>
>> ついでの質問で恐縮ですが、上記例ではscriptを使用して、
>> dataProviderをcastし直していますが、
>> ActionScript(MXML)の記述を正しく(?)記載すれば、
>> こんな、手間な記述は不要でしょうか?
>> Flexの質問ですみませんが、ご存知であればご指導を戴けますと幸いです。
>> 宜しくお願いします。
>>
>> 以上
>>
>> 山田 祐己(Yuki Yamada)
>> E-Mail [E-MAIL ADDRESS DELETED]
>>
>> --nobu<[E-MAIL ADDRESS DELETED]> wrote:
>>> 近藤(nobu)です。
>>>
>>> 試してみました。勝手に変換してくれました。
>>> 以下のような感じです。HelpKeywordというのは、<Bean>に当たる自作
>>> クラス(Entity)です。
>>>
>>> ■Flex側
>>> private function buttonOnClickHandler(event:MouseEvent):void
>>> {
>>> var condition:Array = new Array();
>>> var item1:HelpKeyword = new HelpKeyword();
>>> item1.helpKeywordId = 1;
>>> item1.name = "hoge1";
>>> condition.push(item1);
>>>
>>> var item2:HelpKeyword = new HelpKeyword();
>>> item2.helpKeywordId = 2;
>>> item2.name = "hoge2";
>>> condition.push(item2);
>>>
>>> var item3:HelpKeyword = new HelpKeyword();
>>> item3.helpKeywordId = 3;
>>> item3.name = "hoge3";
>>> condition.push(item3);
>>>
>>> svr.echo(condition);
>>> }
>>>
>>> ■Java側
>>> public void echo(List<HelpKeyword> message) throws Exception
>>> {
>>> ・
>>> ・
>>> ・
>>> }
>>>
>>> やってみるもんです。
>>> AMF3通信で、Collectionの受け渡しは鬼門だと思っていたので、ずっと
>>> 配列しか使っていませんでしたので、勉強になりました。
Seasar-user メーリングリストの案内