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

[E-MAIL ADDRESS DELETED]
2010年 1月 25日 (月) 21:42:16 JST


星です。

> 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で問題なくアクセスできます。

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 メーリングリストの案内