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")); }