我无法使用以下代码在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);
答案 0 :(得分: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使用这两种机制。
答案 1 :(得分:0)
InvalidItemStateException的JavaDocs提供了这个线索:
Node和Property的write方法以及save的抛出异常 如果尝试的更改与更改相冲突,则刷新 通过另一个Session创建的持久工作区也被抛出 Node和Property的方法,如果该对象表示一个项目 已从工作区中删除。
您确定没有任何旧会话仍在运行,可能是一个尚未正常关闭的守护进程吗?