SAStrutsでValidationのタイミングを制御する。
S2StrutsでValidateエラーの表示タイミングを制御するでアノテーションで指定したvalidationと独自に実装したバリデーションを同じタイミングで動作させる事をやったんですが、SAStrutsでも同様な事をしたかったのちょっと調べてみる。
ほとんど同じ方法でできるんじゃないかと思い、そのときのコードを持ってきてちょっと修正。
ActionMapping mapping = (ActionMapping) request.getAttribute(Globals.MAPPING_KEY);
mapping.setValidate(true);
ActionFormWrapper form = (ActionFormWrapper) ActionFormUtil.getActionForm(request, mapping);
ActionErrors errors = form.validate(mapping, request);
errors.add(myValidate());
でできるかと思いきや、form.validate(mapping, request)で呼ばれてるのはActionForm#validate()だったので、NullPointerExceptionで落ちちゃいました。
まぁ多分formをSAStrutsがsetupしてるformを取得できるようにすればできそうなので、続きは午後から。
2008/07/14 15:11 続き
S2StrutsはBeanValidatorFormを使ってValidateを実装してたみたいだけど、SAStrutsはActionWrapperにValidateが実装されているので、どうもこの方法ではダメみたい。
ということでActionWrapper#validateの処理を参考にして、通常のAction内で実装してみる。
S2ActionMapping mapping = (S2ActionMapping) S2ActionMappingUtil.getActionMapping();
ServletContext application = ServletContextUtil.getServletContext();
ActionMessages errors = new ActionMessages();
String validationKey = mapping.getName() + "_index";
Validator validator = Resources.initValidator(validationKey,
ActionFormUtil.getActionForm(request, mapping),
application,
request,
errors,
0);
try {
validator.validate();
} catch (ValidatorException e) {}errors.add(myValidate());
う〜んValidatorまでは取得できるんだけど、Validator#validateの中でformを取得するところでnullになってる。
ActionCustomizerでメソッドのvalidateがtrueの得だけValidatorResourceにFormを設定してるみたいなので、@Execute(validate=false)な状態でvalidatorを取得するのは難しそう。
ちょっと長引きそうなので、また明日。