2

我无法使用以下代码在 apache sling 中为 jackrabbit 创建新的自定义类型。这在 Jackrabbit 上效果很好,但在 Apache Sling 上效果不佳。我是否正确地为吊索执行此操作?谢谢

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

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);
4

2 回答 2

5

如果您使用的是 Sling,则可以通过将 CND 文件放在 OSGi 包中(无论如何,您的 java 代码应该驻留在其中)中,并带有一个告诉 Sling 在哪里可以找到它的标头来避免所有这些。

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

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

于 2013-01-17T08:39:27.227 回答
0

InvalidItemStateException的 JavaDocs提供了这个线索:

如果尝试的更改与通过另一个会话对持久工作区所做的更改发生冲突,则节点和属性的写入方法以及保存和刷新会引发异常。如果该对象表示已从工作区中删除的项目,则节点和属性的方法也会抛出。

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

于 2013-01-16T14:39:04.043 回答