我正在使用此代码在我的 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 原生节点的新节点类型的正确方法吗?