如何让Freemarker在Alfresco中使用java.util.Date而不是org.mozilla.javascript.NativeDate?

时间:2012-10-09 17:44:08

标签: alfresco freemarker

对于接近Alfresco的人来说,这可能是一个问题,因为它有点具体。

我在创建时向网站添加了自定义方面,它包含类型为date的属性:

<type>d:date</type>

现在,我正在扩展 site.lib.ftl 文件以显示此日期:

"startdate": "<#if site.node.hasAspect("my:customAspect")>${siteNode.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",

由于我无法访问宏本身的site.node,因此我扩展了宏参数列表:

<#macro siteJSONManagers site siteNode roles>

所以我可以从 site.get.json.ftl 以及 person.sites.get.json.ftl 调用它:

<@siteLib.siteJSON site=site siteNode=siteNode />

现在,对于site.get.js,我在javascript中准备了sitenode:

model.siteNode = site.node; // or the same with site.getNode;

我的日期已正确解析。 但是,当从 person.sites.get.json.ftl 调用宏时,我无法在javascript控制器中准备site.node,所以我在freemarker中(通过直接调用它)来执行此操作:< / p>

<@siteLib.siteJSONManagers site=site siteNode=site.node roles=roles/>

在使用此表单时,我遇到了以下异常:

"09090011 Wrapped Exception (with status template): 09090096 Error during processing of the template 'Expected method. siteNode.properties[\"my:customAspectDate\"]?string evaluated instead to freemarker.template.SimpleScalar on line 59, column 71 in org\/alfresco\/repository\/site\/site.lib.ftl.'. Please contact your system administrator."

如果我只是显示这个scallar($ {siteNode.properties [“my:customAspectDate”]}),我会将org.mozilla.javascript.NativeDate作为我生成的JSON中的字符串:

"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。

3 个答案:

答案 0 :(得分:4)

如果人们经常在Alfresco中使用Rhino,那么应该在那里修复。发生的事情是:FreeMarker模板不会直接使用java.util.Date表示日期,而是使用freemareker.template.TemplateDateModel。 FreeMarker有一个名为object_wrapper的设置,它是一个将对象转换为freemareker.template.Template{Something}Model - s的对象。显然,Alfresco使用的对象包装器不知道org.mozilla.javascript.NativeDate,并使用TemplateScalarModel将其转换为toString()(FreeMarker的字符串类型)。因此,yourDate?string,其中yourDate是FreeMarker字符串(TemplateScalarModel),只评估与yourDate相同的字符串,因此(...)之后将yourDate失败(你不能调用字符串)。当java.util.Date是FreeMarker日期(TemplateDateModel正确转换为yourDate?string)时,(...)会评估格式化程序方法,因此ObjectWrapper之后可以调用它

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

答案 1 :(得分:3)

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

${siteNode.properties["my:customAspectDate"]?date?string("yyyy-MM-dd")}

Alfresco在Activities Dashlet中做到了这一点:

  

活性-list.get.html.ftl

答案 2 :(得分:1)

Aaaaaand回答我自己的问题,万一其他人也碰到这堵墙两天了:

<#assign nodeR=companyhome.childByNamePath["Sites/" + site.shortName] />
"startdate": "<#if nodeR.hasAspect("my:customAspect")>${nodeR.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",

就像我在forum上所说的那样,我不知道它为什么会这样,而不是另一种。