[Seasar-user:19196] Re: [SAStruts] ネストしたオブジェクトにインデックスでアクセスできない
Yasuo Higa
[E-MAIL ADDRESS DELETED]
2010年 1月 27日 (水) 11:20:06 JST
ひがです。
> 星です。
>
> > 素のStrutsがDTOなら問題なく動いて、SAStrutsがDTOをMapにwrapしているために
> > 動かないということなら、SAStrutsの問題ですね。
> >
> > 修正の方法を考えてみます。
>
> ありがとうございます。
> 説明下手なせいでお話が長くなってすみませんでした。
> よろしくお願い致します。
>
対応しました。
https://www.seasar.org/issues/browse/SASTRUTS-125
ネストしたlist[0][0]は対応してませんが、
とりあえず今回は最もライトな対応をしました。
>
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内