[Seasar-user:14485] Beans.createAndCopy が期待通りに動作しない

Syuuichi Shiohara [E-MAIL ADDRESS DELETED]
2008年 5月 29日 (木) 12:05:49 JST


お世話になっております。
塩原と申します。

org.seasar.framework.beans.util.Beans を使用していて、
期待通りに動作しない場合があるため報告します。

バグでしょうか、それとも使用方法に誤りがあるでしょうか?

[環境]
S2Container 2.4.25 
S2Tiger 2.4.25


(1) 下記の様にプロパティが宣言されているBeanをターゲットとする
  public String abc_value    = "abc";
  public String xyz_value    = "xyz";
  public String other        = "other";
  public String abc_exclude = "exclude";

(2) Beans.createAndCopyメソッドを使用して(1)のBeanのプロパティをマップに格納する
  BeanMap map = Beans.createAndCopy(BeanMap.class, this).prefix("abc_").excludes("abc_exclude").execute();

(3) 期待される結果

  mapの中身
    key["value"] = "abc"

(4) 実際の結果

  mapの中身
    key["value"] = "xyz"
    key["r"] = "other"

  ・xyz_value の値がマップに格納されている。
  ・不要なプロパティがマップに格納されている。

  ※(1)のBeanに4文字以下のプロパティが宣言されていると、
    実行時に IndexOutOfBoundsException が発生します。

(5) 現象の発生条件
  ・prefix() と exclude() を使用する。
  ・include() は使用しない。

(6) ソースを追いかけてみた結果
  AbstractCopy.java の isTargetProperty() メソッドに問題があるように見えます。

  include() が使用されずに、exclude() が使用された場合には、
  ソース 248目からの処理が実行されますが、
  prefix が指定されていた場合の処理が考慮されていません。
  このため、prefix にマッチしないプロパティがターゲットに含まれてしまいます。

  また、マップに格納されるキー名は、prefixの文字数でsubstringしているので、
  結果として、
    ・異なるプロパティの値が格納されてしまう。
    ・IndexOutOfBoundsException が発生する。
  といった現象も発生するようです。


以上です。よろしくお願いいたします。




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