[Seasar-user:9812] TForEachRenderer#encodeChildren()のextractProperties()の実行判定について
    mariko seki
    [E-MAIL ADDRESS DELETED]
       
    2007年 8月  9日 (木) 00:00:59 JST
    
    
  
関です。
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 メーリングリストの案内