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ますが、RepositoryExceptionJCR が新しいタイプのノードをファイル システムに保存できないため、次のメッセージが表示されます。

「有効なプライマリ タイプは、nt:file、nt:folder、nt:resource、および dna:resouce です」

したがって、新しい newNode を superClass から正常に継承していないと思いますnt:resource

これはノードにカスタム プロパティを追加する適切な方法ですか? これは、jcr ネイティブのものから継承する新しい nodeType を定義する適切な方法ですか?

4

1 に答える 1

2

カスタム ノード タイプを作成する必要はありません。代わりに、JCR ミックスインを使用して、組み込みの「nt:file」および「nt:folder」ノード タイプにさらにプロパティを追加できます。その方法を説明するこのブログ投稿を参照してください。

独自のカスタム「nt:file」および「nt:folder」サブタイプを定義する際の問題については、古いバージョンの ModeShape (3.x ではなく 2.x) を使用しているように思われます。ファイル システム コネクタを使用します。後者は、ModeShape と JCR API を介してファイル システム上の既存のファイルを公開するように設計されているため、動作するノードのプライマリ タイプの種類が制限されています。ブログ投稿に記載されているようにミックスインを使用すると、この制限を回避できます。または、この制限がない他のコネクタを検討してください。

于 2013-04-09T13:21:36.900 に答える