我在使用下面的代码为 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);
最佳答案
如果您使用 Sling,您可以通过将 CND 文件放入 OSGi 包(您的 Java 代码应该驻留在其中)来避免这一切,并使用 header 告诉 Sling 在哪里可以找到它。
当您的 bundle 激活时,您的节点类型将自动注册。有关此示例,请参阅 event.cnd文件,该文件在 Sling-Nodetypes 包头中声明,该头在该模块的 pom.xml 中设置。 (或者如果您不使用 Maven,则可以采用任何其他方式)。
另请注意,无论如何,您在 Sling 中都不应该需要 JcrUtils.getRepository,获取存储库的正确方法是通过 SlingRepository OSGi 服务,该服务以一致的方式为所有 Sling 组件处理存储库登录和配置。您可以通过 java 代码中对 SlingRepository 的 @Reference 获取存储库,或者从 Sling 提供的资源获取 JCR session 以请求处理程序(如 servlet 和脚本)。 Slingbucks sample使用这两种机制。
关于java - 在 sling 中创建一个新的 mixin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14355861/