Home » Java, Programing » TeedaのカスタムValidator

Check     このエントリーをはてなブックマークに追加

前回に引き続き、Validator。今回は、自前のカスタムValidatorを作るときどうするかっていう、備忘録です。

もし、あるDBの項目で重複を許したくない場合(ユニークチェックですね)を例として取り上げます。

環境はTeeda + DBFluteを想定し、EMPテーブルのidという項目の重複がある場合にエラーとなる場合です。

まずは、javax.faces.validator.Validatorインターフェースを継承したMyEmpDuplicateValidatorクラスを作成します。場所はDoltengであらかじめ作成されているvalidatorというディレクトリに置きました。

MyEmpDuplicateValidator.java
[java]
package examples.teeda.validator;

import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.internal.FacesMessageUtil;
import javax.faces.internal.UIComponentUtil;
import javax.faces.internal.UIInputUtil;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import org.seasar.framework.container.annotation.tiger.Binding;
import org.seasar.framework.container.annotation.tiger.BindingType;
import org.seasar.framework.util.AssertionUtil;

import examples.teeda.dbflute.cbean.EmpCB;
import examples.teeda.dbflute.exbhv.EmpBhv;

public class MyEmpDuplicateValidator implements Validator {
private static final String MESSAGE_ID = “examples.teeda.validator.EmpDuplicateValidator.INVALID”;
@Binding(bindingType = BindingType.MUST)
public EmpBhv empBhv;

public void validate(FacesContext context, UIComponent component,
Object value) throws FacesException {
// nullな場合無視します。
AssertionUtil.assertNotNull(“context”, context);
AssertionUtil.assertNotNull(“component”, component);
if (UIInputUtil.isEmpty(value)){
return;
}
final String s = value.toString();

// EMPテーブルのid項目に対して件数を取得しています。
FeedCB cb = new FeedCB();
cb.query().setId_Equal(s);
int count = empBhv.selectCount(cb);
if (count > 0){
final Object submittedValue = EditableValueHolder.class.cast(component).getSubmittedValue();
final Object[] args = { UIComponentUtil.getLabel(component),submittedValue};
final FacesMessage message = FacesMessageUtil.getMessage(context, MESSAGE_ID, args);
throw new ValidatorException(message, MESSAGE_ID, args);
}
}
}
[/java]
validateメソッドを実装します。その中で、DBにアクセスする必要があるので、DBFluteのBehaviorをInjectさせて、件数を取得し、件数がある場合に、JSFの作法にのっとり、ValidatorExceptionをthrowしてます。

また、MESSAGE_IDで指定した、文言がエラーとして出力されるので、resourcesのpropertyファイルに追記しておきます。

appMessages_ja.properties
[code]
examples.teeda.validator.EmpDuplicateValidator.INVALID = IDが重複しています。
[/code]

そして、アノテーションを使えるようにするためにインターフェースを作成します。場所は上記と同じ場所に配置しました。

EmpDuplicateValidator.java
[java]
package examples.teeda.validator;

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

import org.seasar.teeda.extension.annotation.validator.Validator;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD})
@Validator(“myEmpDuplicateValidator”)
public @interface EmpDuplicateValidator {
}
[/java]

これで、Pageクラスなどで
[java]
@EmpDuplicateValidator
public String id;
[/java]
と書くだけで、重複チェックが行われるわけです。

少しややこしいように見えますが、一度やってしまうと簡単にカスタムValidatorが作れます。便利ですね。

Check     このエントリーをはてなブックマークに追加
タグ: