61 月2008
Filed under: Web技術, java
Author: ueblog
前回に引き続き、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";
-
-
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);
-
}
-
}
-
}
validateメソッドを実装します。その中で、DBにアクセスする必要があるので、DBFluteのBehaviorをInjectさせて、件数を取得し、件数がある場合に、JSFの作法にのっとり、ValidatorExceptionをthrowしてます。
また、MESSAGE_IDで指定した、文言がエラーとして出力されるので、resourcesのpropertyファイルに追記しておきます。
appMessages_ja.properties
CODE:
-
examples.teeda.validator.EmpDuplicateValidator.INVALID = IDが重複しています。
そして、アノテーションを使えるようにするためにインターフェースを作成します。場所は上記と同じ場所に配置しました。
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 {
-
}
これで、Pageクラスなどで
と書くだけで、重複チェックが行われるわけです。
少しややこしいように見えますが、一度やってしまうと簡単にカスタムValidatorが作れます。便利ですね。
←ぽちっとな

(
0)

(
0)

(
0)

(
0)
Total: 0
Leave a reply