Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

SAStrutsでの日付妥当性チェックで困った

アノテーションを使ったチェックではなくて、プルダウンで選択させた場合のチェックで悩む。

画面には年月日の3つのSELECTメニューがある。

で、Javaの日付チェックは文字列フォーマットからパースできなかったらアウト、というのが一般的らしいので、validateメソッドにこういうコード書いた。

this.nouki = year +"/"+ month + "/" + day;

try {
   //日付妥当性チェック
   DateFormat format = DateFormat.getDateInstance();
   format.setLenient(true);
   format.parse(this.nouki);

} catch(ParseException e) {
   //存在しない日付だとExceptionが起こるからcatchしてReThrow
  throw new ActionMessagesException("errors.invalid.nouki");
}

catchしてReThrowすればいいんじゃねって思ったら、例外がががが。

どうやら例外が起こった段階で何かしらの処理が走るみたいで、ReThrowするとActionMessageIntercepterに正しく例外が伝わらないらしく、そんなKEYねーよボケといわれる。

org.seasar.struts.exception.ActionMessagesException: {org.apache.struts.action.GLOBAL_MESSAGE=[errors.invalid.nouki[]]}
	at XXXForm.validate(XXXForm.java:75)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:96)
(略)

かといって、自前で日付チェック作ってboolで返すのはチト辛い。再発明したくない・・・。

何かうまい方法ないかなぁ。

追記

id:backpaper0さんのご指摘にそって、こう書いた。ちゃんとエラーが返りました。そうよね、Exception投げなくてもerrorにaddすりゃいいんだ。ありがとうございましたー。

} catch(ParseException e) {
   //存在しない日付だとExceptionが起こるからcatchしてReThrow
   //throw new ActionMessagesException("errors.invalid.nouki");
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.invalid.nouki"));
}