如何让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
是自由标记日期(a
java.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
是自由标记日期(a
java.util.date
正确转换为
TemplateDateModel
)时,
yourDate?字符串的计算结果为格式化程序方法,因此它后面的
(…)
可以调用它


因此,如果在Alfresco中使用Rhino(JavaScript)对象很常见,那么他们应该扩展
ObjectWrapper
来识别Rhino对象。也许他们所需要做的就是在freemarker.ext.rhino.RhinoWrapper中混合使用

您好,您可以在freemarker中使用以下内容:

${siteNode.properties["my:customAspectDate"]?date?string("yyyy-MM-dd")}
Alfresco在活动中这样做