我从 JCR 存储库中检索内容对象和属性的代码是不是有效?

Posted

技术标签:

【中文标题】我从 JCR 存储库中检索内容对象和属性的代码是不是有效?【英文标题】:Is my code to retrieve a content object and property from a JCR repository valid?我从 JCR 存储库中检索内容对象和属性的代码是否有效? 【发布时间】:2016-01-08 16:38:56 【问题描述】:

我正在为 O'Reilly (http://flyingsquirrelbook.com/) 完成一本书。

在本书中,我比较了几个代码示例,以 (1) 从存储库中检索内容对象,以及 (2) 从该对象中检索单个属性/属性。我这样做是为了演示不同 CMS 的 API 是不同的,但在逻辑上有些相似。我有来自 C# (Episerver)、php (Concrete5)、Python (Plone) 和 Magnolia (Java,使用 JCR) 的示例。

我已经验证了前三个,但我没有使用 Java 或 JCR 的经验。我需要有人查看这段代码并告诉我这是否是一种合理接受的方式来执行我上面所说的操作:

Session session = MgnlContext.getJCRSession("myWorkspace");
Node myPage = session.getNodeByIdentifier("123");
String title = myPage.getProperty("PageTitle").getValue().getString() 

出于任何原因,这是否严重错误?

【问题讨论】:

有效吗? 你有任何理由相信它大错特错吗?你真的认为 *** 是对一本书进行研究的合理方式吗? 我不知道,我不是 Java 开发人员。虽然是的,我正在研究一本书,但这仍然是 - 在其核心 - 一个关于代码准确性的技术问题。我认为这非常合适。这不像是在征求某人的意见或进行调查。实际上,如果我只是想让这段代码在某个地方执行,会有什么不同吗? 【参考方案1】:

虽然您不会让编译器抱怨代码,但您可以做一些事情来改进示例。getNodeByIdentifier() 方法采用 UUID 格式的节点,因此您应该显示相同而不是使用简单的 Int作为身份证件。 同样,属性名称通常以小写字母开头。 最后一次致电getValue() 是不必要的。您可以直接在属性对象上调用getString()

HTH, 一月

【讨论】:

正是我需要的。谢谢。 或者使用PropertyUtil.getString(myPage, "PageTitle")(还有一个getString方法,带有第三个参数作为默认值)。顺便说一下,Magnolia 页面的页面标题属性实际上只是 title。页面的 Magnolia 工作区称为website【参考方案2】:

Apache Jackrabbit "first hops" page 提供了一些您可能会觉得有帮助的示例。

具体来说,SecondHop 类展示了如何创建、检索和删除内容。这是一个显示检索的 sn-p:

Node node = root.getNode("hello/world"); 
System.out.println(node.getPath()); 
System.out.println(node.getProperty("message").getString());

该示例使用 getNode() 获取节点,但您也可以通过标识符获取它:

Node node = session.getNodeByIdentifier(id);

除了 Jan 提到的 getString() 之外,您的第三行缺少分号。

【讨论】:

以上是关于我从 JCR 存储库中检索内容对象和属性的代码是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JCR 中的 SQL 从子名称中检索父名称

JCR 长耳兔分页

从 JCR 文件节点中获取文件

检索并分配 jcr:mixinTypes magnolia 中的多值属性

将 LoginContext 作为凭据传递给 JCR(java 内容存储库)中的存储库登录

JCR 存储库可用于 Junit 测试