[Seasar-user:19195] Re: [SAStruts] ネストしたオブジェクトにインデックスでアクセスできない

[E-MAIL ADDRESS DELETED]
2010年 1月 26日 (火) 18:06:15 JST


星です。

> 素のStrutsがDTOなら問題なく動いて、SAStrutsがDTOをMapにwrapしているために
> 動かないということなら、SAStrutsの問題ですね。
>
> 修正の方法を考えてみます。

ありがとうございます。
説明下手なせいでお話が長くなってすみませんでした。
よろしくお願い致します。


2010年1月26日10:13 Yasuo Higa <[E-MAIL ADDRESS DELETED]>:
> ひがです。
>
>> 星です。
>>
>> > commons-beanutilsが"list" ではなく "list[0]"でアクセスしてくるなら、
>> > そっち(commons-beanutils)のほうがおかしい気がしますが、
>> > 素のStrutsでもMapにget("list[0]")されたら動かないのではないでしょうか。
>> >
>> > SAStrutsの処理がおかしいなら、当然修正すべきだと思いますが、
>> > get()に"list[0]"でアクセスされて動くようにするのはちょっと違う気がします。
>>
>>
>> 確かに素のStrutsもActionForm→Map→List<Dto>という階層を持ったオブジェクトに
>> map.list[0].propertyでアクセスするとエラーになります。
>> ここはSAStrutsと同じ動きです。
>>
>> ですが今回はActionForm→Dto→List<Dto>というオブジェクトへのアクセスであり、
>> これは素のStrutsで問題なくアクセスできます。
>>
> 素のStrutsがDTOなら問題なく動いて、SAStrutsがDTOをMapにwrapしているために
> 動かないということなら、SAStrutsの問題ですね。
>
> 修正の方法を考えてみます。
>
> DynaBeanを使うとcommons-beanutilsからはBeanにみえるので、
> より正確ですが、パフォーマンス的に重い気がするので、
> 場当たりですが、list[n]を解析する方法でやってみます。
>
> 議論が長くなってお手数をかけてしまいましたが、
> よろしくお願いします。
>
>> SAStrutsの機能リファレンスに注意書きとしてJavaBeansはMapにラップされる
>> と書いてあるのでSAStrutsの仕様上
>> ActionFormにJavaBeansを定義していてもそのプロパティは自動的にMapにラップされ
>> commons-beanuitlsのJavaBeansへのインデックス付きアクセス機能が利用できなくなる
>> というのが現在の仕様だと思います。
>>
>> 開発者がJavaBeansにアクセスしようとしたのに(意識せず)Mapにアクセスしていて
>> 従来通りのコーディングでは意図した通りに動かないというのが問題(?)だと思います。
>>
>> BeanWrapperがcommons-beanutilsからJavaBeansと認識されて従来通り動作するか、
>> BeanWrapperがJavaBeansとして振舞うかのどちらかが私としてはありがたい動きです。
>> でもcommons-beanutilsの仕様に依存するという形になるのならば
>> あまりよろしくない対応かもしれません。
>>
>>
>> 2010年1月25日16:43 Yasuo Higa <[E-MAIL ADDRESS DELETED]>:
>> > ひがです。
>> >
>> >> 星です。
>> >>
>> >> > BeanWrapper系ならdto.listの型がリストならリストのラッパーを
>> >> > かえるから大丈夫な気がしますけど。
>> >>
>> >> nestedでアクセスした場合、ListWrapperが正しく処理されません。
>> >>
>> >> form.dto.list[0].propertyにアクセスする場合は
>> >> FormWrapper→BeanWrapper→ListWrapper
>> >> と順繰りアクセスされるのを期待しますが、BeanWrapperがListWrapperへうまくアクセスしてくれない状態です。
>> >>
>> >> というのは、BeanWrapperのgetメソッドに渡されるキーが "list" ではなく "list[0]"となるためです。
>> >> BeanWrapperはフィールドに定義されたプロパティ名のみを持っているため
>> >> "list[0]"とアクセスしてもプロパティが見つからないというエラーになっています。
>> >>
>> > commons-beanutilsが"list" ではなく "list[0]"でアクセスしてくるなら、
>> > そっち(commons-beanutils)のほうがおかしい気がしますが、
>> > 素のStrutsでもMapにget("list[0]")されたら動かないのではないでしょうか。
>> >
>> > SAStrutsの処理がおかしいなら、当然修正すべきだと思いますが、
>> > get()に"list[0]"でアクセスされて動くようにするのはちょっと違う気がします。
>> --
>> [E-MAIL ADDRESS DELETED]


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