2007-08-31

FlexのHTTPServiceでPOSTされた日付型をパースする

mx.rpc.http.(mxml.)HTTPServiceを使ってサーバにリクエストを投げるとき、contentTypeが "application/x-www-form-urlencoded"(デフォルト)だと、sendメソッドの引数に与えられたオブジェクトのプロパティ群がリクエストパラメータ(サーブレットのrequest.getParameterで取得できるデータ)として使われる。

このとき、Date型のオブジェクトが含まれていると "Fri Aug 31 18:10:14 GMT+0900 2007" のような形式で送信されるのだが、一般的な Javaフレームワークはこの形式の文字列を自動的に日付型へ変換できない。少なくともStruts2ではそうだった。
(なおcontentType="application/xml"でリクエストを送信する場合、日付型のオブジェクトはISO8601なる形式でエンコードされる)

仕方ないのでサーバ側では文字列として一度受け取って、パースしてやる必要がある。
SimpleDateFormatクラスでは、この形式に対するフォーマット文字列は "EEE MMM dd HH:mm:ss z yyyy" となる(ロケールはUS)。
が、手元の Java 1.5 ではタイムゾーンのあたりでパースに失敗するようで使えなかった。

しかたないので ICU4jの SimpleDateFormatクラスを使ってみたところパース出来たので以下はサンプル。

import com.ibm.icu.text.SimpleDateFormat;

Date parsedDate =
new SimpleDateFormat(
"EEE MMM dd HH:mm:ss z yyyy", Locale.US).parse(dateString);

ところで、これに関する調べ物をしている間に Java標準のSimpleDateFormatクラスは MTセーフでないぞコノヤロウっていう話を目にしたんだけど、同一インスタンスに対するメソッド呼び出しがMTセーフでないという「だけ」なら都度newするかスレッド毎にインスタンスを持てばいいわけなのでそれほど問題ではないような気がする。
「だけ」でない場合は、これはなかなか厄介な問題のような気がする。

2 件のコメント:

Blogger Yasushi さんは書きました...

struts2(というかxwork)ならconverterを設定するのが普通。
http://struts.apache.org/2.0.9/docs/type-conversion.html

threadsafeなDateFormatはcommons-langにあったりする。
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/FastDateFormat.html

java.text.SimpleDateFormatのzone、GMT+時差の形式はGMT+hours:minutes みたいね。:無しはだめなのか。

しかし送信側も微妙なフォーマットだなぁ。ISO8601とかSMTP dateとかじゃないのはなぜだろう。

2007/09/01 11:36  
Blogger shimarin さんは書きました...

FastDateFormatは parseに対応してないくさい

2007/09/01 14:37  

コメントを投稿

<< ホーム