[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 メーリングリストの案内