axis。日付変換の罠
axisを使っていて気になったことが一つ。
xsd:datetimeとjavaの日付を変換する際にGMT・JSTの違いによって9時間の誤差が生じることは以前のシステムで経験があったので、あらかじめCalendarのSerializer/Deserializerをカスタマイズして誤差を吸収していたが、それに関連した内容。
xsd:datetimeの値に相当するxmlの内容が有り得ない日付(2/30など)でもエラーにならず、3/2などに変換されてしまうのだ。
まあ原因はすぐに見当がついた。
CalendarDeserializerの中で使用しているSimpleDateFormatに対してsetLenient(false)を呼んでいないのだ。
axisオリジナルのCalendarDeserializerからしてそうなっている。
日付を文字列として受け取る項目についてはその日付が有効かどうかのチェックはしていたのだが、まさかそんなところがひっかかろうとはねぇ・・・
しかし0230という文字列を3/2として解釈するのがデフォルトというのはどうなんだろう?
確かにそういうのが必要な時があるのはわかるけど・・・
このクラス、parseメソッドもちょっとおかしい。
Date date = new SimpleDateFormat("yyyyMMdd").parse("201001011");
というコードは何のエラーも出さず日付に変換してしまう。
お〜い、最後の「1」は?
確かにjavadocにはそれで正しいんだ的なことが書いてあるけどさ・・・