检查给定 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.5 TemplatingFunction.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) 然后使用ifelse 感谢详尽的回答和 cmets。很好发现,没有看到 damfn.getAsset(String UUID) 如果资产不存在则返回 null (而不是抛出错误)。否则,使用自定义 freemarker 指令的解决方案非常简洁。对于! 解决方案:这可以“降低”任何异常的日志级别吗?还是只针对特定方法抛出的异常?

以上是关于检查给定 UUID 的节点是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

删除边/节点后查询两个节点之间是不是存在路径

如何检查Firebase中是不是存在具有多个字段的节点(子)?

检查节点是不是存在,如果不存在则创建

使用 XSLT 检查节点是不是存在

检查是不是存在节点并检查其属性值

检查xml父节点中是不是存在两个xml节点