java - Freemarker 日期分配看似有效日期失败

标签 java spring templates spring-mvc 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 代码中的 getter 如下所示:

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。它似乎大部分时间都有效,但有时会失败......

想法?

最佳答案

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

编辑:另一个可能的原因是有时 FreeMarker“区域设置”设置不是英语。对于非英语,“AM”/“PM”后缀是不同的,因此会导致此错误。

关于java - Freemarker 日期分配看似有效日期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720096/

相关文章:

java - Spring webflux,mongodb : Document is not saved into database

使用Picasso时出现java.lang.NoSuchMethodError

java - Spring session scoped bean是否保存在HttpSession中?

c++ - 将元组成员包装在其他模板化类型中

c++ - 如何在 C++ 模板类中为单个方法创建专门化?

Java 构建路径

java - 如何替换正则表达式中的文本?

c++ - 使模板接受特定的类/类族?

java - 在构造函数参数中引用 bean 时是否可以使用 Spring EL?

java - 运行外部 JUnit Jar 的 Spring 导致 java.lang.Exception : No runnable methods