2012-01-03 11 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) 
... 

的线bar.ftl其中它的失败看起来像这样:

<#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); 
} 

所以对我来说,它看起来像一切都正确返回,并且代码设置正确。我正在使用FreeMarker 2.3.16和Spring MVC。它似乎大部分时间工作,但有时会失败...

想法?

回答

0

错误消息意味着,在内部,DateFormat.parse已抛出java.text.ParseException。由于异常消息中给出的字符串应该使用该模式进行解析(我希望你的示例是确切的和真实的),并且由于它只是偶尔发生,所以它在日期格式周围像一个并发(多线程)问题缓存。如果你可以构建一个独立的测试来证明这一点,那么可以更快地找到它(我几乎负责维护FM)。快速查看源代码没有任何东西跳到我身上......同步在那里。

编辑:另一个可能的原因是,有时FreeMarker“语言环境”设置不是英语。 “AM”/“PM”后缀对于非英语来说是不同的,所以它会导致这个错误。

+0

我的例子是确切和真实的,除了我分别用foo和bar替换文件名...我认为你和ChssPly76都帮助我这里。我同意这可能是一个并发问题。虽然是一个创可贴的解决方案,但我认为我会采用ChssPly76的建议,并避免使用解析模式。我假设这也会避免日期格式缓存? – Galen 2012-01-04 17:01:24

+0

我在FreeMarker 2.3.16版本上。移动到新版本可能有帮助吗? – Galen 2012-01-04 17:13:31

+0

它不会避免使用日期格式缓存,因为在将日期转换为字符串时也会使用它。但是,如果问题特定于'parse'方法,那么它会避免它。从2.3.16升级将无济于事,因为此错误(如果它是FreeMarker错误)至今仍是未知数。 – ddekany 2012-01-04 18:20:04

0

你的代码看起来有效,我不知道为什么它失败 - 特别是“有时”。

然而,有一件事让我觉得很奇怪,那就是你将日期首先转换为字符串(在getCreatedTime()之内),以便将其解析回FreeMarker模板中。为什么不把它作为开始的日期呢?喜欢的东西:

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

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

感谢您的帮助。根本原因实际上是一些并发问题,我要进一步调查 – Galen 2012-01-04 20:24:14