2012-01-03 9 views
1

私はすべての時間を起きていないような奇妙な問題に実行しているんだけど、それがないとき、それは次のようになります。Freemarkerの日の割り当てが失敗する

Error: on line 60, column 31 in foo/bar.ftl 
Expecting a date here, found: 2011-12-29 04:37AM 
The problematic instruction: 
---------- 
==> assignment: createDate=project.createdTime?datetime("yyyy-MM-dd hh:mma") [on line 60, column 9 in foo/bar.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.template.TemplateModelException: Error: on line 60, column 31 in foo/bar.ftl 
Expecting a date here, found: 2011-12-29 04:37AM 
    at freemarker.core.BuiltIn$dateBI$DateParser.parse(BuiltIn.java:334) 
    at freemarker.core.BuiltIn$dateBI$DateParser.get(BuiltIn.java:305) 
    at freemarker.core.BuiltIn$dateBI$DateParser.exec(BuiltIn.java:316) 
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93) 
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 
    at freemarker.core.Assignment.accept(Assignment.java:90) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.process(Environment.java:190) 
    at freemarker.template.Template.process(Template.java:237) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233) 
    at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 
... 

ラインで

<#assign createDate = project.createdTime?datetime("yyyy-MM-dd hh:mma")> 

Project.javaコード内のゲッターは、次のようになります:

private Date createdTime; 
... 
public String getCreatedTime() { 
    SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd hh:mma"); 
    return createdTime == null ? null : sm.format(createdTime); 
} 

それは、このようなルックスを失敗していますbar.ftl私にとっては、すべてが正しく返されているように見え、コードは正しく設定されているようです。私はFreeMarker 2.3.16とSpring MVCを使用しています。ほとんどの場合は動作するようですが、時には失敗します...

アイデア?

答えて

0

エラーメッセージは、内部で、DateFormat.parsejava.text.ParseExceptionを投げた、ということを意味します。例外メッセージで指定された文字列はそのパターンで正常に解析される必要があります(そして、あなたの例が正確で本当のものであることを願っています)、時にはときどき起こるので、日付形式を中心に並行性(マルチスレッド)キャッシュ。これを実証するスタンドアロンテストを構築できれば、それは早く見つけることができます(私はFMの管理を担当しています)。すばやくソースコードを見て、私に何もジャンプしません...同期があります。

編集:FreeMarkerの「ロケール」の設定が英語でないことがあります。 "AM"/"PM"接尾辞は英語以外の言語では異なるため、このエラーが発生します。

+0

私の例は、ファイル名をそれぞれfooとbarに置き換えた以外は正確で実際です...私はあなたとChssPly76の両方が助けてくれたと思いますここに。おそらく並行性の問題だと私は同意する。救済策はありますが、私はChssPly76の提案に目を向けると思いますし、解析パターンを全く使わないでください。私はこれも日付形式のキャッシュを避けると仮定していますか? – Galen

+0

私はFreeMarkerバージョン2.3.16を使用しています。より新しいバージョンへの移行は潜在的に助けになるでしょうか? – Galen

+0

'Date'を' String'に変換するときにも使われるので、日付形式のキャッシュは避けられません。しかし、問題が 'parse'メソッドに固有のものであれば、それは回避されます。 2.3.16からのアップグレードは役に立ちません。なぜなら、このバグはFreeMarkerのバグだと思いますが、それはこれまで知られていませんでした。 – ddekany

0

あなたのコードは有効に見えますが、なぜそれが失敗するのかはわかりません - 特に「時には」。

私には奇妙なことがありますが、FreeMarkerテンプレート内でそれを解析するためにのみ、まず日付を文字列に変換しています(getCreatedTime())。なぜそれを日付として渡すことはありませんか?ような何か:

// Project.java 
public Date getCreatedTime() { 
    return this.createdTime; 
} 

// bar.ftl 
<#assign createDate = project.createdTime?datetime> 
+0

ご協力いただきありがとうございます。根本的な原因は実際にはいくつかの同時の問題です。私はさらに調査するつもりです – Galen

関連する問題