[Seasar-user:14679] Re: [S2BlazeDS]Array 型からjava.util.List型への変換

nobu [E-MAIL ADDRESS DELETED]
2008年 6月 13日 (金) 00:40:47 JST


近藤(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 mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
> 
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 



Seasar-user メーリングリストの案内