如何让Freemarker在Alfresco中使用java.util.Date而不是org.mozilla.javascript.NativeDate?
这可能是一个接近露天的人的问题,因为它有点具体 我在创建时向站点添加了一个自定义特性,它包含一个日期类型的属性:如何让Freemarker在Alfresco中使用java.util.Date而不是org.mozilla.javascript.NativeDate?,alfresco,freemarker,Alfresco,Freemarker,这可能是一个接近露天的人的问题,因为它有点具体 我在创建时向站点添加了一个自定义特性,它包含一个日期类型的属性: d:日期 现在,我正在扩展site.lib.ftl文件以显示此日期: “startdate”:“${siteNode.properties[“my:customAspectDate”]?字符串(“yyyy-MM-dd”), 由于无法访问宏本身中的site.node,我扩展了宏参数列表: 因此,我可以从site.get.json.ftl以及person.sites.get.json.
d:日期
现在,我正在扩展site.lib.ftl文件以显示此日期:
“startdate”:“${siteNode.properties[“my:customAspectDate”]?字符串(“yyyy-MM-dd”),
由于无法访问宏本身中的site.node,我扩展了宏参数列表:
因此,我可以从site.get.json.ftl以及person.sites.get.json.ftl调用它:
现在,对于site.get.js,我准备使用javascript编写sitenode:
model.siteNode=site.node;//或与site.getNode相同代码>
我的日期解析正确。
但是,当从person.sites.get.json.ftl调用宏时,我无法在javascript控制器中准备site.node,因此我使用freemarker(直接调用它):
使用此表单时,我会遇到以下异常:
“09090011包装异常(使用状态模板):09090096处理模板“预期的方法.siteNode.properties[\“my:customAspectDate\]”时出错?字符串改为在org\/alfresco\/repository\/site\/site.lib.ftl中第59行第71列计算为freemarker.template.SimpleScalar。请与系统管理员联系。”
如果我只是显示这个scallar(${siteNode.properties[“my:customAspectDate”]}),我会在生成的JSON中将org.mozilla.javascript.NativeDate作为字符串显示:
“startdate”:“org.mozilla.javascript”。NativeDate@7a6e5e2e“,
我可以通过在site.get.json.ftl中为siteNode设置相同的参数来重复这一点。
如果我使用siteNode.properties[“cm:created”],我甚至可以重复它
在我看来,当javascript控制器从节点创建模型对象时,创建的日期道具将被创建为java.util.date或Freemarker使用的任何东西,并且当Freemarker本身创建该属性时,它将被转换为org.mozilla.javascript.NativeDate
有人能指出我该如何改进我的代码,让它显示日期吗?我可以使用什么使我的调用获得相同的值
如果有什么不同,我将使用SVN HEAD的Alfresco。aaaaaaa并回答我自己的问题,以防其他人也撞到这堵墙两天:
<#assign nodeR=companyhome.childByNamePath["Sites/" + site.shortName] />
"startdate": "<#if nodeR.hasAspect("my:customAspect")>${nodeR.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",
“startdate”:“${nodeR.properties[“my:customAspectDate”]?字符串(“yyyy-MM-dd”)}”,
正如我在上一篇文章中所说,我不知道为什么它是这样工作的,而不是另一种。aaaaaaa请回答我自己的问题,以防有人也撞到这堵墙两天:
<#assign nodeR=companyhome.childByNamePath["Sites/" + site.shortName] />
"startdate": "<#if nodeR.hasAspect("my:customAspect")>${nodeR.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",
“startdate”:“${nodeR.properties[“my:customAspectDate”]?字符串(“yyyy-MM-dd”)}”,
正如我在上一篇文章中所说的,我不知道为什么它是这样工作的,而不是另一种。如果人们经常在户外与犀牛一起工作,那么这个问题应该在那里解决。发生的情况是:FreeMarker模板没有直接使用java.util.Date
来表示日期,而是使用freemareker.template.TemplateDateModel
。FreeMarker有一个名为object\u wrapper
的设置,它是一个将对象转换为freemareker.template.template{Something}Model
-s的对象。显然,Alfresco使用的对象包装器不知道org.mozilla.javascript.NativeDate
,它使用toString()
将其转换为TemplateScalarModel
(这是FreeMarker的字符串类型)。因此,yourDate?string
,其中yourDate
是一个FreeMarker字符串(TemplateScalarModel
)将计算为与yourDate
相同的字符串,因此,(…)
之后将失败(不能调用字符串)。当yourDate
是自由标记日期(ajava.util.date
正确转换为TemplateDateModel
)时,yourDate?字符串的计算结果为格式化程序方法,因此它后面的(…)
可以调用它
因此,如果在Alfresco中使用Rhino(JavaScript)对象很常见,那么他们应该扩展ObjectWrapper
来识别Rhino对象。也许他们所需要做的就是加入freemarker.ext.rhino.RhinoWrapper
如果人们经常在露天使用rhino,那么这应该在那里解决。发生的情况是:FreeMarker模板没有直接使用java.util.Date
来表示日期,而是使用freemareker.template.TemplateDateModel
。FreeMarker有一个名为object\u wrapper
的设置,它是一个将对象转换为freemareker.template.template{Something}Model
-s的对象。显然,Alfresco使用的对象包装器不知道org.mozilla.javascript.NativeDate
,它使用toString()
将其转换为TemplateScalarModel
(这是FreeMarker的字符串类型)。因此,yourDate?string
,其中yourDate
是一个FreeMarker字符串(TemplateScalarModel
)将计算为与yourDate
相同的字符串,因此,(…)
之后将失败(不能调用字符串)。当yourDate
是自由标记日期(ajava.util.date
正确转换为TemplateDateModel
)时,yourDate?字符串的计算结果为格式化程序方法,因此它后面的(…)
可以调用它
因此,如果在Alfresco中使用Rhino(JavaScript)对象很常见,那么他们应该扩展ObjectWrapper
来识别Rhino对象。也许他们所需要做的就是在freemarker.ext.rhino.RhinoWrapper中混合使用您好,您可以在freemarker中使用以下内容:
${siteNode.properties["my:customAspectDate"]?date?string("yyyy-MM-dd")}
Alfresco在活动中这样做