同じコードの 3 つのバリエーションをテストしたところ、問題なく動作しました。異なる動作の理由を知りたいです。
だから私は、長いタイムスタンプをECMA日付標準形式の文字列に変換するこの作業コードを持っています:
lazy val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")
implicit def dateToECMAFormat(time: Long) = new {
def asECMADateString: String = {
dateFormat.format(new java.util.Date(time))
}
}
動作する他のバリエーション:
implicit def dateToECMAFormat(time: Long) = new {
val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")
def asECMADateString: String = {
dateFormat.format(new java.util.Date(time))
}
}
しかし、SimpleDateFormat が常に再インスタンス化されることは望ましくありません。だから私は最初のものを好みます。しかし今、本当の謎:
val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")
implicit def dateToECMAFormat(time: Long) = new {
def asECMADateString: String = {
dateFormat.format(new java.util.Date(time))
}
}
この最後のコードはコンパイルされますが、実行時に例外がスローされます。Play フレームワークからスタック トレースを取得できませんでした。Play フレームワーク 2.1 のコントローラーが 500 (Internal Server Error) を返し、それ以上の情報がないことを知っているだけです (他のコントローラーは動作しますが、主要なサービスはまだ稼働しています)。
いずれの場合も、呼び出しは次のようになります。100000L.asECMADateString
誰かが私にさまざまな動作を説明できますか?最後の動作が機能しないのはなぜですか? val、lazy val、def の違いはよく理解できましたが、何かが足りないように感じます。
アップデート
コードは次のようにオブジェクトで呼び出されます。
object MyController extends Controller{
implicit val myExecutionContext = getMyExecutionContext
lazy val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")
implicit def dateToECMAFormat(time: Long) = new {
def asECMADateString: String = {
dateFormat.format(new java.util.Date(time))
}
}
def myAction = Action {
Async {
future {
blocking{
//here get some result from a db
val result = getStuffFromDb
result.someLong.asECMADateString
}
} map { result => Ok(result) } recover { /* return some error code */ }
}
}
}
これは、基本的な playframework Async アクション コールです。