Java 具有自定义属性的JCR新节点类型

Java 具有自定义属性的JCR新节点类型,java,jcr,repository,Java,Jcr,Repository,我正在使用这段代码在我的Modeshape JCR存储库中编写文件 Session session = //some session Node folderNode = session.getRootNode(); //init some calendar and a file from fileSystem Calendar lastModified = Calendar.getInstance(); File myFile = new File("c://temp//pic.jpg");

我正在使用这段代码在我的Modeshape JCR存储库中编写文件

Session session = //some session
Node folderNode = session.getRootNode();

//init some calendar and a file from fileSystem
Calendar lastModified = Calendar.getInstance();
File myFile = new File("c://temp//pic.jpg");    

//create nt:file node
Node fileNode = folderNode.addNode(myFile.getName(), "nt:file");

// create the mandatory child node - jcr:content
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty("jcr:mimeType", "");
resNode.setProperty("jcr:encoding", "");
resNode.setProperty("jcr:lastModified", lastModified);

// add some binary data                    
InputStream stream = new BufferedInputStream(new FileInputStream(myFile));
Binary binary = session.getValueFactory().createBinary(stream);
lastModified.setTimeInMillis(myFile.lastModified());
resNode.setProperty("jcr:data", binary);
我想添加一些像这样的自定义属性

resNode.setProperty("myCustomProperty", "some value", PropertyType.STRING)
但正如所有文档中所描述的,由于尝试向本机JCR节点类型添加自定义属性,我得到了一个
ConstraintViolationException

我试图生成一个新的节点类型,该节点类型继承自本机
nt:resource
,然后使用我的自定义属性扩展它:

Session session = //some session
Workspace workspace = session.getWorkspace();
NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
NodeTypeTemplate ndt = nodeTypeManager.createNodeTypeTemplate();

//i define my new custom propertie under the new nodeType
PropertyDefinitionTemplate createPropertyDefinitionTemplate = nodeTypeManager.createPropertyDefinitionTemplate();
createPropertyDefinitionTemplate.setName("myCustomProperty");
createPropertyDefinitionTemplate.setRequiredType(PropertyType.STRING);
ndt.getPropertyDefinitionTemplates().add(createPropertyDefinitionTemplate);

String myNodeTypeName = "newCustimNodeType";
ndt.setName(myNodeTypeName);
//heritates from nt:resource
String[] str = {"nt:resource"};
ndt.setDeclaredSuperTypeNames(str);
nodeTypeManager.registerNodeType(ndt, true);
session.save();
这样我们就避免了
ConstraintViolationException
,但现在我们得到了一个
RepositoryException
,因为JCR无法在文件系统中保存我的新类型节点,并显示以下消息:

有效的主要类型为nt:文件、nt:文件夹、nt:资源和dna:资源

所以我想我没有成功地从超类
nt:resource
继承新的newNode

这是向节点添加自定义属性的正确方法吗?
这是从jcr原生节点继承定义新节点类型的正确方法吗?

您不需要创建自定义节点类型。相反,您可以使用JCR mixin向内置的“nt:file”和“nt:folder”节点类型添加更多属性。看这个,它解释了怎么做


至于定义自己的自定义“nt:file”和“nt:folder”子类型的问题,听起来您使用的是较旧版本的ModeShape(2.x而不是3.x),并且您使用的是文件系统连接器。后者旨在通过ModeShape和JCR API公开文件系统上的现有文件,因此,它仅限于与之协作的节点的主要类型。使用博客文章中提到的mixin可以绕过这个限制。或者,考虑其他没有这种限制的连接器。

因为我们不使用CND文件,有一种方法来创建和注册这些新的MIXIN程序吗?是的。JCR API的NodeTypeManager提供了一种通过可变“模板”创建节点类型定义的方法。这些模板是定义,可以使用管理器注册。