我正在使用此代码在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 nodeType,我得到ConstraintViolationException
。
我尝试生成一个新的NodeType,它从Native 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 nt:resource
中篡改新的newNode。
这是向节点添加自定义属性的正确方法吗? 这是从jcr本机定义一个新的nodeType的正确方法吗?
答案 0 :(得分:2)
您无需创建自定义节点类型。相反,您可以使用JCR mixins为内置的“nt:file”和“nt:folder”节点类型添加更多属性。请参阅此blog post,了解如何执行此操作。
至于定义自己的自定义“nt:file”和“nt:folder”子类型的问题,听起来好像你使用的是旧版本的ModeShape(2.x而不是3.x),您正在使用文件系统连接器。后者旨在通过ModeShape和JCR API公开文件系统上的现有文件,因此它受限于其使用的节点的主要类型。使用博客文章中提到的mixins将解决此限制。或者,考虑其他没有此限制的连接器。