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を取得するのは難しそう。
ちょっと長引きそうなので、また明日。