SAStrutsのValidationの結果をtext/html以外で戻す。

SAStruts(Struts)でValidationの検証結果、エラーがあった場合通常のWebであればhtml上に表現するんですが、AJAXやRESTな使い方をしている場合、XMLやJSONなんかで戻したいものです。

簡単な方法はvalidationのinput属性にエラー専用のActionを用意して、そこで処理すれば良いです。
でもそれでは全てのinput属性をみんな同じ値にしないといけないのでちょっと満足行かないのとSAStrutsの挙動を知る上で調べてみました。

SAStrutsではStrutsのActionクラスをラップしたActionWrapperがexecuteを実行しているのでActionWrapper#processErrorsで対処してあげればいいです。

ActionWrapperのサブクラスMyActionWrapperをつくって、processErrorsのみオーバライドしたあとに、MyActionWrapperを呼ばせようとしてみましたが、ActionWrapperはS2RequestProcessorで直接インスタンスを生成しているのでS2RequestProcessorもサブクラスを作らないとダメでした。diconなんかでやってないかなぁと淡い期待を抱きつつdicon探したら無かった。。。


さてどっちが楽かなぁ?

後、@Executeのinput属性にデフォルト値ってつけれないのかな。
やっぱりこれも拡張した方が良いんだろうか。これは後で調べる。


2008/07/14 11:54

@Executeのサブクラスを作って、inputフィールドのdefaultを好きな値にします。
ActionCustomizerのサブクラスで@Executeアノテーションを取得してるところを変更する。あとはdiconの設定をさっき作ったサブクラスにすればできるけどなんかHotDeployで初回アクセス時に「@Executeがない」エラーになる。2回目からは上手くいくし、cool deployにすれば動いてるっぽんだけど。

これもあとで調べる