S2RequestProcessorとインターセプターは相性が悪い?

ActionMessagesExceptionをキャッチしたら前ページへ、@Execute(roles="xxx")で権限なし例外があったら指定されたページへ、それ以外の例外は指定したページへ・・・みたいな感じにしたかったんだけど、ちょっとうまくいかない。

というのも権限チェックはS2RequestProcessor#processRoles()でやっててそこからNoRoleRuntimeException が発生するため、costomizer.diconで指定するインターセプタには捕らえられない。

例外を処理するインターセプター - Ruby Study Go

引用した記事に書かれているようなことが、ちょうど自分にも発生しました。

会員系サイトによくある「ようこそxxxさん」のように全てのページでユーザー名が表示できるように、requestにユーザー名をセットする独自のインターセプターを作って、actionCustomizerに設定していたのですが、validatorでエラーになるとユーザー名が表示されない。

なぜかと思って調べていくと、エラーがあるとS2RequestProcessor(実際はRequestProcessor)#processValidate()で処理が打ち切られるようで、Actionに仕掛けたインターセプターまで到達しない。

結局、インターセプターに実装していた処理は、S2RequestProcessorクラスを継承させたクラスへ実装しました。


インターセプターが必ず動くことを前提にした作りにしてしまうと、結構ハマりそうな所なので覚えておこう。

こういったビューへ共通的な文言をセットする事って多々あると思うのだが、もっとスマートなやり方はあるのかなぁ?