检查给定 UUID 的节点是不是存在
Posted
技术标签:
【中文标题】检查给定 UUID 的节点是不是存在【英文标题】:Check if Node exists for given UUID检查给定 UUID 的节点是否存在 【发布时间】:2017-04-04 20:18:11 【问题描述】:上下文:我正在运行 Magnolia CMS 5.x 并尝试以编程方式(在 freemarker
中)检查节点是否存在以避免在尝试时引发异常通过$damfn.getAssetLink(<someUUID>)
或类似方式访问它。
有没有办法检查具有给定 UUID 的节点是否存在?
在查看NodeUtil.java、SessionUtil.java、Session.java、JCRUtils、TemplatingFunction (cmsfn:
) 和 DamTemplatingFunctions (damfn:
) 时,我没有发现任何有趣的东西
我只发现你可以使用jackrabbit.510166.n4.nabble.com/Checking-if-node-exists-td516003.html通过路径检查
资源:
Node.java - API doc - Adobe's Content Repository for Java 2.0 Session.java - API doc - Adobe's Content Repository for Java 2.0 JCRUtils.java - API doc - Apache Jackrabbit 2.0.0 API NodeUtil.java - code - Magnolia Main Project NodeUtil.java - API doc - Magnolia Main Project 5.5 SessionUtil.java - code - Magnolia Main Project SessionUtil.java - API doc - Magnolia Main Project 5.5TemplatingFunction.java
(cmsfn:
) explained by Magnolia CMS' team
DamTemplatingFunctions.java
(damfn:
) explained by Magnolia CMS' team
DamTemplatingFunctions.java
code
【问题讨论】:
【参考方案1】:(有关使用标准 Magnolia 指令的简单解决方案,请参阅下面的更新)
如何使用搜索searchfn
https://documentation.magnolia-cms.com/display/DOCS/searchfn
或QueryUtil
https://nexus.magnolia-cms.com/content/sites/magnolia.public.sites/ref/5.4/apidocs/info/magnolia/cms/util/QueryUtil.html
并按 UUID 搜索:
https://wiki.magnolia-cms.com/display/WIKI/JCR+Query+Cheat+Sheet
SELECT * FROM [nt:base] WHERE [jcr:uuid] = '7fd401be-cada-4634-93fa-88069f46297b'
在 Freemarker 中使用它:
您可以将每个 Java 函数(例如搜索)包装在自定义 freemarker 指令中。
见documentation.magnolia-cms.com/display/DOCS/Templating+functions
在您的模块 xml 中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module SYSTEM "module.dtd" >
<module>
...
<components>
<id>main</id>
<component>
<type>com.company.my.MyTemplatingFunctions</type>
<implementation>com.company.my.MyTemplatingFunctions</implementation>
<scope>singleton</scope>
</component>
</components>
...
com.company.my.MyTemplatingFunctions.doesNodeExist()
调用QueryUtil
标准类 - 或SessionUtil
如:
package com.company.my;
public class MyTemplatingFunctions
public boolean doesNodeExist(String workspace, String id)
if ( SessionUtil.getNodeByIdentifier(workspace, id) != null )
return true;
return false;
然后在你的.ftl
:
[#-- @ftlvariable name="myfn" type="com.company.my.MyTemplatingFunctions" --]
$myfn.doesNodeExist(relevantWorkspace, someUUID)
== 更新 ==
只需查看 Magnolia 文档:
https://documentation.magnolia-cms.com/display/DOCS/damfn#damfn-Getasset
这不行吗?
[#assign myAsset = damfn.getAsset("jcr:20d6e4e3-fe53-4b23-8d64-6e67a1c1667f")!]
然后您可以在哪里使用 Freemarker 中的 if
/ else
查询myAsset
?
这看起来是最简单的解决方案。尚未对其进行测试,但看起来应该可以将 UUID 与 jcr:
前缀一起传递。
此外:如果您不需要显式检查资产是否存在,而只是不想在日志中出现模板错误,则可以像这样添加!
:
$damfn.getAssetLink(<someUUID>)!
那么您不会收到模板错误,只会在日志中收到一条 WARN 消息。
【讨论】:
感谢马蒂亚斯。我已经澄清了这个问题,表明我想在 freemarker 中执行此操作。也许您可以为您建议的每个解决方案添加 freemarker 示例? 注意:searchfn
需要MTE module,如Templating functions Magnolia doc 的“功能集”表中所示。
查看我的更新回复。关于 MTE:您不使用 MTE 吗? MTE 是当前 5.x 中的标准,而 STK 已“弃用”。或者您根本不想依赖任何这些模板引擎?以上应该可以在没有 MTE 的情况下工作,但它需要您自己的自定义 Java 类作为自定义指令。
@AdrienBe 查看我的第二次更新。使用damfn
指令甚至还有更简单的方法。 damfn:getAsset('jcr:'+uuid)
然后使用if
和else
。
感谢详尽的回答和 cmets。很好发现,没有看到 damfn.getAsset(String UUID)
如果资产不存在则返回 null (而不是抛出错误)。否则,使用自定义 freemarker 指令的解决方案非常简洁。对于!
解决方案:这可以“降低”任何异常的日志级别吗?还是只针对特定方法抛出的异常?以上是关于检查给定 UUID 的节点是不是存在的主要内容,如果未能解决你的问题,请参考以下文章