我有一个Freemarker函数,其目的是打印传递给它的任何值,特别是难以处理日期。
据我所知,当Freemarker无法确定日期的哪个部分正在使用时,在尝试直接打印该值时会出错,因此日期需要一些特殊的外壳,但我一直无法找到这个功能的可靠解决方法。
我的功能看起来像这样:
<#function format value=''>
<#if value?is_date>
<#-- code to attempt to handle all types of date -->
<#else>
<#-- handle non-date values -->
</#if>
</#function>
到目前为止,我尝试了以下内容:
首次尝试:始终打印日期和时间;例如value?datetime
问题:如果价值已被告知'仅限日期(例如format(value?date)
- 我想支持的用法),则会发生炸弹袭击事件
第二次尝试:尝试使用attempt / recover指令打印原始值以处理问题情况; e.g。
<#attempt>
<#return value>
<#recover>
<#return value?datetime>
</#attempt>
问题:尝试/恢复指令没有成功捕获异常 - 而是像以前一样传播出来
我尝试了很多其他的东西,但上面的方法更明智,不幸的是都没有成功。似乎有一个catch-22:如果日期类型未知我只能通过选择一个任意类型来打印以应用于所有日期值,但如果我尝试将该类型应用于已知类型的日期,它将失败类型不匹配的地方。
在尝试打印值之前,有没有办法确定值的日期类型是否已知?如果是这样,我可以在必要时使用内置的?datetime。
理想情况下,我可以告诉Freemarker只打印无法确定确切类型的完整日期,而不是爆炸 - 但我不确定目前是否可行。
答案 0 :(得分:2)
更新:在FreeMarker 2.3.21中,您可以使用<#if value?is_date_like>${value?datetime_if_unknown}<#else>...
是的,应该存在像?is_unknown_type_date
这样的东西,但它不是......我是一个FM维护者所以我会在2.3.21中添加它(但是在它发布之前不要屏住呼吸)。与此同时,你可以写一个TemplateMethodModelEx
来做到这一点。正如您将看到的那样实现它是如此简单,如何使它们可以访问模板有点未被记录......一种方法是将TemplateMethodModelEx
掺入数据模型或{{变量'集合{{{} 1}}。另一种方法是将其放入一些常见的Configuration
- 或#import
模板,例如#included
。
<#assign isUnknownTypeDate='com.example.IsUnknownTypeDateMethod'?new()>
对我有用(使用每晚2.3.21,但我不记得曾经破坏过)。但是不管怎么说都不要用它,因为它会记录错误。 #recover
仅适用于紧急情况,不适用于正常的程序流程。
在提供未知类型日期的默认格式时......我对它感到不安,因为这些问题在开发过程中不会被捕获,很少有人会关心使用不同的FM配置进行生产而不是开发