独自 Validator の作成

SAStruts で Validator を定義しようとしてはまったのでメモしておく。

validator-rules.xml には






mail.annotation.emailAddressListFile アノテーション


package mail.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.seasar.struts.annotation.Msg;
import org.seasar.struts.annotation.Validator;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Validator("emailAddressListFile")
public @interface EmailAddressListFile {
Msg msg() default @Msg(key = "errors.emailAddressListFile");
String target() default "";
}

チェックの実体は mail.util.EmailAddressListFileChecks に実装する。


package mail.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.struts.action.ActionMessages;
import org.seasar.struts.validator.S2FieldChecks;

/**
*
* @author h-kageyu
*
*/
public class EmailAddressListFileChecks extends S2FieldChecks {
/**
*
*/
private static final long serialVersionUID = 1802441601456737980L;

/**
*
* @param bean
* @param validatorAction
* @param field
* @param errors
* @param validator
* @param request
* @return 正しいとき true 、それ以外のとき false
*/
public static boolean validateEmailAddressListFile(Object bean,
ValidatorAction validatorAction,
Field field, ActionMessages errors,
Validator validator, HttpServletRequest request) {
String value = getValueAsString(bean, field);
if (!GenericValidator.isBlankOrNull(value)) {
:とりあえず略
return false;
}
return true;
}
}

application_ja.properties には


errors.emailAddressListFile={0}はメールアドレスのリストファイルではありません。

アクションフォームには以下のように書く。


@EmailAddressListFile
public List toList = null;

とりあえずこんな感じで作ればいいのだけど、アノテーション記述する際に


@Documented
@Validator("EmailAddressListFile")
public @interface EmailAddressListFile {
と記述してしまって、小1時間ほどはまった。

例外としては、以下のように「EmailAddressListFile という Validation が無いよ」というものだけど、EmailAddressListFile というアノテーションもあるし、大文字小文字を間違えているわけでもない(これが間違い!)のに何で動かないんだろう。

javax.servlet.ServletException: java.lang.RuntimeException: org.apache.commons.validator.ValidatorException: No ValidatorAction named EmailAddressListFile found for field toList

結局 @Validator("emailAddressListFile") という間違いを発見するのに、最初に参照していた http://d.hatena.ne.jp/i-takehiro/20080710 さんのページにて小文字表記されているのに気が付き一件落着。