いまさらStrutsのActionFormでハマった

昔過ぎてどうやっていたか忘れていて小一時間ハマったのでメモ

複数のIDを渡したくてListを使ったのだが、なかなかうまく行かなかった。

最初は単純にsetter/getterを用意したが、List#setでIndexOutOfBoundsが発生した。

private List<BigDecimal> ids = new ArrayList<BigDecimal>();
public void getIds() {
  return ids;
}
public void setIds(List<BigDecimal> ids) {
  this.ids = ids;
}

自動的にリストのサイズを拡張するListの実装を作って対処。

public class AutoResizeArrayList<E> extends ArrayList<E> {
  @Override
  public E set(int index, E element) {
    for (int i = size(); i <= index; i++) {
      add(null);
    }
    return super.set(index, element);
  };
  @Override
  public E get(int index) {
    return super.get(index);
  }
}

次に、List#get()でしたものがナゼかStringになってしまう現象に遭遇。
これは、プロパティがセットされる際にgetIds()したリストへset()しているが、その時にStringがセットされていた。
Genericsだとこう可能性はあることは知っていたが、初めて遭遇した)
そこで、setIds(List ids)を削除してsetIds(int index, BigDecimal id)を追加したところ、正しくBigDecimalがセットされた。
ちなみにsetIds(List ids)が残っているとgetIds()が呼ばれてうまくいかない。