概要
Struts2の"Type Conversion"(自動型変換機能)はDate型にも標準で対応しているが、
リクエストパラメータの指定方法によっては時刻情報が抜け落ちて変換されてしまう。
#パラメータの指定
パラメータを含めたURLを直打ちしてDate型変数「targetDate」に代入する。
時刻情報が抜け落ちる例。
targetDate=2016/01/01_12:30:00
当初、取り敢えず、と日付と時刻の間にアンダースコアを入れてみたところ
エラーで落ちることなくすんなり通ったため、
上手いこと許容してくれたと思っていたが、結果は2016年1月1日0時00分だった。
正しくは半角スペース。
targetDate=2016/01/01%2012:30:00
コンバータの処理を見てみる
中を見てみると、DefaultTypeConverterを継承したDateConverterにて変換が行われており、
フォーマットはDateFormatを使用している。
com.opensymphony.xwork2.conversion.impl.DateConverter.java
private DateFormat[] getDateFormats(Locale locale) {
DateFormat dt1 = DateFormat.getDateTimeInstance(3, 1, locale);
DateFormat dt2 = DateFormat.getDateTimeInstance(3, 2, locale);
DateFormat dt3 = DateFormat.getDateTimeInstance(3, 3, locale);
DateFormat d1 = DateFormat.getDateInstance(3, locale);
DateFormat d2 = DateFormat.getDateInstance(2, locale);
DateFormat d3 = DateFormat.getDateInstance(1, locale);
DateFormat rfc3399 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
return new DateFormat[] { dt1, dt2, dt3, rfc3399, d1, d2, d3 };
}
DateFormat.SHORTからLONGまで(とRFC3399形式)が許容されている。
targetDate=16/01/01%2012:30
targetDate=2016-01-01T12:30:00
targetDate=2016/01/01%2012:30:00%20JST
標準のコンバータは結構ざっくりした作りになっているため、
自作コンバータにて他フォーマット対応や例外処理などを細かく実装し、使用する方が望ましい。