2

我正在使用此代码在我的 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)

但正如所有文档中所述,我得到一个ConstraintViolationException因为试图将自定义属性添加到本机 JCR nodeType。

我试图生成一个继承自 Native 的新 NodeType 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 无法在 fileSystem 中保存我的新类型节点和消息:

“有效的主要类型是 nt:file、nt:folder、nt:resource 和 dna:resouce”

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

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

4

1 回答 1

2

您不需要创建自定义节点类型。相反,您可以使用 JCR mixins 为内置的“nt:file”和“nt:folder”节点类型添加更多属性。请参阅此博客文章,其中解释了如何执行此操作。

至于定义您自己的自定义“nt:file”和“nt:folder”子类型的问题,听起来您使用的是旧版本的 ModeShape(2.x 而不是 3.x),而且您正在使用文件系统连接器。后者旨在通过 ModeShape 和 JCR API 公开文件系统上的现有文件,因此它在使用的节点的主要类型方面受到限制。使用博文中提到的 mixins 将解决这个限制。或者,考虑其他没有此限制的连接器。

于 2013-04-09T13:21:36.900 回答