[Seasar-user:14075] Re: [S2Strtus]validationについて

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2008年 5月 4日 (日) 11:32:44 JST


中村(taedium)です。

> プロパティをListにし実行してみましたが
> エラーが出てしまい動作致しませんでした。

> すみません。
> 何が原因か考えられますでしょうか?

S2StrutsはActionFormとしてのDTOを内部的にはDynaBean
として扱うのですが、BeanUtilsはDynaBean経由でListのindexつきの
setterに値を設定できないようです。
ですので、プロパティをListにしたらどうでしょうという私の案は
動かないですね。配列を使ってもらう必要があります。
すみません。

S2Strutsは、配列へのアノテーションによるバリデーションは
配列の各要素に対するバリデーションだと認識してしまいますので、
配列全体へのバリデーションを行いたい場合は、
バリデータを登録するロジックを置き換えてあげる必要があります。

以下、その方法を説明します。

次のようなクラスを用意します。

public class MyHandler extends TigerValidatorAnnotationHandler {
  @Override
  protected Field createField(Field field, PropertyDesc propDesc,
      String depends) {
    if (propDesc.hasWriteMethod()) {
      Method m = propDesc.getWriteMethod();
      if (m.isAnnotationPresent(ArrayCheck.class)) {
        Field newField = new Field();
        newField.setDepends(depends);
        newField.setProperty(getFieldProperty(field, propDesc));
        newField.setIndexedListProperty(field.getIndexedListProperty());
        return newField;
      }
    }
    return super.createField(field, propDesc, depends);
  }
}

ここに登場するArrayCheckアノテーションは
配列全体を扱うバリデーション用のアノテーションです。
独自に作成する必要があります。
このアノテーションがついている場合だけ特別扱いしています。

上記クラスはdiconファイルでFactoryクラスに登録します。

<component>
@[E-MAIL ADDRESS DELETED](new hoge.MyHandler())
</component>

ActionFormとしてのDTOは次のようになります。

@StrutsActionForm(name = "hogeForm")
public class HogeDto {
  private String[] arrayText = new String[4];
  public String[] getArrayText() {
    return arrayText;
  }
  @ArrayCheck
  public void setArrayText(String[] arrayText) {
    this.arrayText = arrayText;
  }
  public String getArrayText(int index) {
    return arrayText[index];
  }
  public void setArrayText(int index, String value) {
    arrayText[index] = value;
  }
}

indexつきのsetter/getterと通常のsetter/getterの
両方が必要になることに注意してください。
(前者はBeanUtilsが使用し、後者はS2Strutsが使用します)

ここに説明した内容に加え、
http://s2struts.seasar.org/ja/validation.html
の設定も必要になります。

設定が大変な気がするので、
アノテーションによる検証にこだわらず
Actionで直接検証するようにしたほうわかりやすいかもしれません。

-- 
Toshihiro Nakamura



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