SAStrutsのActionFormのString型以外のパラメータに変なのがきても何とかする

ActrionForm のInteger型のプロパティーなどに"a"とかを入れようとしたら IllegalPropertyRuntimeException が起こって ErrorHandler をぶっ飛ばしてエラー画面が出てしまうというデフォルト動作をカスタマイズ。失敗したら握りつぶして(!)処理を続行するようにした。

public class DangerousS2RequestProcessor extends S2RequestProcessor {
  @Override
  protected void setProperty(Object bean, String name, Object value) {
    try{
      super.setProperty(bean, name, value);
    } catch (Exception t) {
      log.debug("invalid property "+name+" at "+value,t);
    }
  };
}

struts-config.xml の controller の processorClass にこのクラスを設定する。

不正なものを入れようとしたパラメータには、バリデーション時には null(かコンストラクタなどで設定された値)が入っている。その後にFormのバリデーションやActionが走って、そこで入力値のチェックをするので大丈夫だと思います。

人間がtextボックスで入力する以外の、URL直接いじるとかしないと不正にならないもの(セレクトボックスで選択する奴とか、リンク上でしか出てこない値とか、hiddenでしか渡さないものとか)は、「不正なリクエストエラー」が出て問題ないのだけれど、エラーログを切り分けてそのときはメールを飛ばさない的な事をする設定が分からなかったので「不正な値などない!」という大胆な変更を行った。

ところでActionFormで指定されたバリデーションができているかどうかのテストってどうやるんだろう……

追記

b:backpaper0 SAStruts アノテーションによるバリデーションは「設定」だからテストする必要は無いと個人的には思う。 2010/02/01

バリデーションの機能テストというよりはアノテーションがFormに設定できているか(意図した値をパラメータに設定したときに意図したエラーが起こるかどうか)のテストです。

さらに追記

b:backpaper0 SAStruts アノテーションによるバリデーションは「設定」だからテストする必要は無いと個人的には思う。/「設定できているか?」をテストするとなると、web.xml や dicon もテストしなきゃ!ってなると思うのでやはり、不要かと。 2010/02/01

web.xml や diconもテストしたほうがいいとおもいます。うまくテストする方法が無い、というだけで。というか書き直す度に確認作業(=テスト)しますよね?