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