有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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)
...

酒吧排队。ftl的故障情况如下所示:

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

项目中的关键人物。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。它似乎大部分时间都能工作,但有时会失败

想法


共 (2) 个答案

  1. # 1 楼答案

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

    然而,让我感到奇怪的一件事是,您首先将日期转换为字符串(在getCreatedTime()内),然后在FreeMarker模板中解析它。为什么不把它作为开始的日期呢?比如:

    // Project.java
    public Date getCreatedTime() {
        return this.createdTime;
    }
    
    // bar.ftl
    <#assign createDate = project.createdTime?datetime>
    
  2. # 2 楼答案

    错误消息表示,在内部,DateFormat.parse已抛出java.text.ParseException。由于异常消息中给出的字符串应该按照该模式进行解析(我希望您的示例是准确的和真实的),并且由于它只是偶尔发生,所以它就像日期格式缓存中的并发(多线程)问题一样糟糕。如果您可以构建一个独立的测试来演示这一点,这将使查找速度更快(我负责维护FM,差不多)。快速查看源代码,没有什么会吓到我。。。同步器在那里

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