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

Yasuo Higa [E-MAIL ADDRESS DELETED]
2010年 1月 26日 (火) 10:13:17 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で問題なくアクセスできます。
> 
素の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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 


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