Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Freemarker日期分配到看似有效的日期失败_Java_Spring_Templates_Spring Mvc_Freemarker - Fatal编程技术网

Java 将Freemarker日期分配到看似有效的日期失败

Java 将Freemarker日期分配到看似有效的日期失败,java,spring,templates,spring-mvc,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

我遇到了一个奇怪的问题,似乎不是一直都在发生,但当它发生时,它看起来是这样的:

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")>
private Date createdTime;
...
public String getCreatedTime() {
    SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd hh:mma");
    return createdTime == null ? null : sm.format(createdTime);
}
bar.ftl中失败的行如下所示:

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")>
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。它似乎大部分时间都能工作,但有时会失败


想法?

您的代码看起来有效,我不知道它为什么会失败-尤其是有时

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

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

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

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


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

我的示例准确而真实,只是我分别用foo和bar替换了文件名。。。我想你和ChssPly76都在这里帮助了我。我同意这可能是一个并发问题。虽然是一个创可贴解决方案,但我想我将使用ChsSPLY76的建议,避免完全使用解析模式。我假设这也可以避免日期格式缓存?我使用的是FreeMarker 2.3.16版。移动到一个更新的版本可能会有帮助吗?它不会避免日期格式缓存,因为在将日期转换为字符串时也会使用它。但是,如果问题是特定于解析方法的,那么它会避免它。从2.3.16升级不会有帮助,因为这个bug(如果它是FreeMarker bug的话)到目前为止还是未知的。。。有时FreeMarker区域设置是否可能不是英语?非英语的AM/PM后缀不同,因此会导致此错误。ddekany-您可能使用了区域设置。大多数成功的用户都来自我们。似乎失败的一个来自俄罗斯。。我会进一步调查此事。谢谢如果是这样的话,有没有优雅的解析方法?只需省略“a”解析标志?谢谢您的帮助。根本原因实际上是一些并发问题,我将进一步调查