S2Strutsでアノテーションを利用したカスタムValidationの作成

S2Strutsアノテーションを利用したカスタムValidationの作成をするには次の手順をやっていきます。

  1. 新規Validation作成
  2. application.propertiesに追記
  3. validator-rules.xmlに追記
  4. Validationアノテーションの作成

アノテーションで変数がある場合のみ次の手順も行う

  1. ConfigRegisterの作成
  2. validator.dionに追記

新規Validation作成

package org.seasar.struts.examples.validator;

import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;

public class HogeCheck {
	
	public static boolean validate(Object bean,
            ValidatorAction validatorAction, Field field,
            ActionMessages errors, Validator validator,
            HttpServletRequest request) {
		
		String value = ValidatorUtils.getValueAsString(bean, field.getProperty());
		String doubt = field.getVarValue("doubt");
		
		if (value.compareTo(doubt) != -1) {
            errors.add(field.getKey(), Resources.getActionMessage(
                    validator, request, validatorAction, field));
            return false;
		}
		return true;
		
	}
}

application.propertiesに追記

errors.hoge={0}は{1}じゃあだめです

validator-rules.xmlに追記

<validator name="hoge"
      classname="org.seasar.struts.examples.validator.HogeCheck"
         method="validate"
   methodParams="java.lang.Object,
                 org.apache.commons.validator.ValidatorAction,
                 org.apache.commons.validator.Field,
                 org.apache.struts.action.ActionMessages,
                 org.apache.commons.validator.Validator,
                 javax.servlet.http.HttpServletRequest"
        depends=""
            msg="errors.hoge"/>

Validationアノテーションの作成

package org.seasar.struts.examples.validator.annotation;

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

import org.seasar.struts.validator.annotation.tiger.ValidatorTarget;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@ValidatorTarget
public @interface Hoge {
	
	String doubt();

}

ConfigRegisterの作成

package org.seasar.struts.examples.validator.config;

import java.util.Map;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Var;
import org.seasar.struts.validator.config.ConfigRegister;

public class HogeConfigRegisterImpl implements ConfigRegister {

	public void register(Field field, Map parameter) {
        String doubt = (String) parameter.get("doubt");
        Var var = new Var();
        var.setName("doubt");
        var.setValue(doubt);
        field.addVar(var);
	}
}

validator.dionに追記

<component name="hogeConfigRegister"
  class="org.seasar.struts.examples.validator.config.HogeConfigRegisterImpl"/>

注意点

validator-rules.xmlに記述するnameとアノテーション命名が一致していること。

アノテーションとConfigRegisterのプレフィックスが一致していること。
(一致していないとAPサーバ起動時にコンテナの読み込み対象外になってしまうようだ)

参考サイト

S2Strutsで利用できるアノテーションを使用したValidationを作成
http://s2struts.seasar.org/ja/validation.html