[Seasar-user:9817] Re: TForEachRenderer#encodeChildren()のextractProperties()の実行判定について
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
2007年 8月 9日 (木) 10:42:14 JST
大谷です.
下記報告と提案ありがとうございます.
頂いた内容を基本にそのまま取り込む方向で考えています.
とり急ぎ、宜しくお願いします.
07/08/09 に mariko seki<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 関です。
>
> Teeda-1.0.7からTeeda-1.0.8に移行した際に発生した現象です。
>
> 検索結果をforEachを使って表示する画面において
>
> 繰り返し項目のGetterの中でxxxIndexを利用している場合に、
> 検索結果が0件の場合に、IndexOfBoundsExceptionが発生するようになってしまいました。
>
> public String getYyy() {
> return xxxItems.get(this.xxxIndex).getYyy();
> }
>
> Teeda-1.0.7までは、検索結果0件の場合はこのMethod自体が
> 呼び出されていなかったようなのですが、
> Teeda-1.0.8にすると、検索結果0件の場合でも1回は
> このMethodが呼び出されるようになっているようです。
>
> なので、当然上記のままだとIndexOfBoundsExceptionが発生してしまいます。
>
> Program側でxxxItemsの件数をCheckすれば回避はできるのですが、
> できればしっかり原因を明確にして正しい動きになって欲しいと思っています。
>
>
>
> TForEachRenderer#encodeChildren()において
>
> /**
> * TEEDA-305
> */
> final Map result = extractProperties(pageBeanDesc, page);
>
> が、Teeda-1.0.8にて追加されたようです。
> これは、Pageクラスの値を一度避難させて、処理後にPageクラスに値を
> 戻しているように見えますが、検索結果0件のときはこの処理自体が不要な
> 気がしますがどうでしょうか?
>
> final int rowSize = (items != null) ? items.length : 0;
>
> Map result = null
> if (rowSize > 0) {
> result = extractProperties(pageBeanDesc, page);
> }
> ...
> if (result != null) {
> putProperties(pageBeanDesc, page, result);
> }
>
>
> また、TForEachRenderer#extractProperties()は、
> その後Pageに値をSetするために実行するものですが、
> Setterが存在しないPropertyを取得する必要がないように思えます。
> 実際、TForEachRenderer#putProperties()ではpd.hasWriteMethod()を
> 利用して、Setterが存在しないPropertyは無視するようになっています。
> この判定をTForEachRenderer#extractProperties()でやってもいいのでは
> ないでしょうか?
>
> TForEachRenderer#extractProperties():
>
> if (propertyName.endsWith("Items") || !pd.hasReadMethod()) {
> continue;
> }
>
> ↓↓↓
>
> if (propertyName.endsWith("Items")
> || !pd.hasReadMethod()
> || !pd.hasWriteMethod()) {★Setterが無い場合はcontinue
> continue;
> }
>
> これにより、Setterを書いていなければ、
> 上記の例外も発生しませんし(例え無駄に呼び出されていても)、
> 少しでもPerformanceが良くなるかと思います。
>
>
> ご検討よろしくお願いします。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
--
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================
Seasar-user メーリングリストの案内