Freemarker 不分配 staticUtil

Posted

技术标签:

【中文标题】Freemarker 不分配 staticUtil【英文标题】:Freemarker does not assign staticUtil 【发布时间】:2016-09-17 10:22:46 【问题描述】:

我在liferay 6.2上工作过Application Display Templates,我使用freemarker帮助对liferay的动态数据列表进行分页。当我升级到 liferay 7 时,这是一个问题。 Liferay 7 使​​用代码<#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)> 获取记录。

旧代码:

<#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) >

它不起作用。

所以我尝试&lt;#assign serviceLocator = staticUtil["com.liferay.portal.template.ServiceLocator"]&gt;staticUtil 出错。

以下已评估为 null 或缺失: ==> staticUtil [在模板“20115#20159#21387”第 9 行第 27 列] 提示:如果已知失败的表达式合法地引用了有时为 null 或缺失的内容

在 portal-ext.properties 中我添加了:

freemarker.engine.restricted.classes=
freemarker.engine.restricted.packages=
freemarker.engine.restricted.variables= 

【问题讨论】:

【参考方案1】:

在liferay-ce-portal-7.1.1.2-ga3版本中,文件重命名为

com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration.config

【讨论】:

【参考方案2】:

在 Liferay 7.1 中。你会在

下找到 Freemaker Engine

控制面板 -> 系统设置 -> 平台 -> 模板引擎

【讨论】:

【参考方案3】:

进入控制面板->系统设置->基础页面

从列表中找到FreeMarker Engine点击它。

通过单击 (-) 图标从受限变量中删除 serviceLocator 变量和 staticUtil

如果您想使用 staticUtil 对象,则还要从受限变量中删除此变量。

保存。

重启 Liferay 服务器。

您将直接访问应用程序显示模板中的 serviceLocator 对象。

【讨论】:

【参考方案4】:

您引用的属性已移至 Liferay 7/DXP 中的 OSGI 配置。 要部署它们,您需要创建一个名为 com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration.cfg 的文件并将其放在 $LIFERAY_HOME/osgi/configs

文件内容如下:

restrictedVariables=

要查找所有配置及其默认值,您可以查看 com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration

你可以在 Liferay 源代码中找到。

【讨论】:

它似乎不适用于我的本地环境。我完全按照你说的做了。你知道这是否已经被弃用了吗? 这是 LR 7 的正确过程,但只是作为此处的增量,您可以微调以使用您需要的内容,留下其他限制...restrictedVariables=["","utilLocator"," objectUtil","staticFieldGetter","staticUtil"]【参考方案5】:

我认为 portal-ext.properties 中的那些属性在 liferay 7 中被忽略了。

您可以在控制面板 → 配置 → 系统设置 → 基础 → FreeMarker 引擎中管理这些属性,并从受限变量中删除“staticUtil”(或直接删除“serviceLocator”)。 (需要重启 Liferay)

【讨论】:

它们不会被忽略,它们已被移入 OSGI 配置文件。根据我所经历的版本和服务包,从控制面板更新它们可能会导致 Liferay 实例停止(不再启动),所以我强烈反对这样做 在从控制面板更新这些值时,我也遇到了 Liferay DXP 中断。你必须做一些数据库 Foo 才能让 LR 再次启动。我会在上面投票给你。 对于任何有 LR 启动问题的人,这是我为重新启动 LR 所做的:youtu.be/Aot3oRP7hDg @Totò 我已经尝试在 osgi 文件夹中创建一个文件 com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration.cfg,如下面的答案中所述,但它似乎没有效果.你知道它有什么问题吗?

以上是关于Freemarker 不分配 staticUtil的主要内容,如果未能解决你的问题,请参考以下文章

如果 Freemarker 中不存在 XML 节点,则分配空字符串

在 Freemarker 中取消分配普通变量

Freemarker / Netsuite - 将变量分配给特定的项目数量

Freemarker 将列表长度分配给局部变量

Apache freemarker 模板分配和比较值

在 Freemarker 模板中访问 portlet 命名空间