在吊索中创建一个新的mixin

问题描述 投票:2回答:2

我无法使用以下代码在apache吊索中为jackrabbit创建新的自定义类型。这在Jackrabbit上运行良好,但在Apache Sling上没有。我是否正确地为吊索做这件事?谢谢

以下代码为我提供了“javax.jcr.InvalidItemStateException:Conflict”。我使用独立的吊索,是唯一的用户,所以绝对没有冲突。

Repository repository = JcrUtils.getRepository("http://localhost:8080/server");

Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));

NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry();
registry.registerNamespace("my", "http://my.com/v1.0");

CndImporter.registerNodeTypes(new FileReader("C:\\test.cnd"), session);
java jackrabbit jcr sling
2个回答
5
投票

如果你正在使用Sling,你可以通过将你的CND文件放在一个OSGi包中(你的java代码应该驻留在那里)来避免这一切,并使用一个标题告诉Sling在哪里找到它。

激活捆绑包后,将自动注册您的节点类型。有关此示例,请参阅event.cnd文件,该文件在Sling-Nodetypes包头中声明,该头文件在该模块的pom.xml中设置(或者如果您不使用Maven,则以任何其他方式)。

另请注意,您不应该在Sling中使用JcrUtils.getRepository,获取存储库的正确方法是通过SlingRepository OSGi服务,该服务以一致的方式为所有Sling组件处理存储库登录和配置。您可以通过@Reference将存储库获取到Java代码中的SlingRepository,或者从Sling提供的Resource获取JCR会话以请求servlet和脚本等处理程序。 Slingbucks sample使用这两种机制。


0
投票

InvalidItemStateException的JavaDocs提供了这样的线索:

如果尝试的更改与通过另一个Session创建的持久工作空间的更改发生冲突,则Node和Property的write方法抛出异常,并通过save和refresh抛出。如果该对象表示已从工作空间中删除的项,则还会抛出Node和Property的方法。

您确定没有任何旧会话仍在运行,也许是一个尚未正常关闭的守护程序进程?

© www.soinside.com 2019 - 2024. All rights reserved.