从JCR仓库访问资源数据

时间:2013-06-05 06:15:17

标签: java jackrabbit cq5 jcr sling

使用sling资源接口我试图访问保存为二进制属性的数据到我的JCR节点。目前我正在通过以下方式进行操作,即返回null值。

Resource dataResource = resourceResolver.getResource("/testNode/A/test.txt");
ValueMap properties = dataResource.adaptTo(ValueMap.class);        

String expected = properties.get("jcr:data").toString(); // null
InputStream content = (InputStream) actualProp.get("jcr:data");  // null 

任何人都可以让我知道缺少什么,或者读取jcr:data属性的最佳方法是什么,它以二进制数据的形式出现。 dataResource是一个 nt:unstructured

它显示的输出是: - 的 org.apache.sling.jcr.resource.internal.helper.LazyInputStream@4f4c8085

4 个答案:

答案 0 :(得分:9)

您提到您使用的是Sling资源API而不是JCR API。您可以直接从资源调整资源到InputStream,如下所示:

Resource dataResource = resourceResolver.getResource("/testNode/A/test.txt/jcr:content");
InputStream is = dataResource.adaptTo(InputStream.class);

只要资源是nt:file或nt:resource,jcr:data属性的内容就应该作为InputStream返回。

从那里你可以看到Tuan在他的回答中建议的InputStream。

您可以从以下单元测试中看到此功能的示例: http://svn.apache.org/repos/asf/sling/whiteboard/fmeschbe/resource/jcr.resource/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java

答案 1 :(得分:1)

如果我没记错的话,你的路径应该更像:

Resource dataResource = resourceResolver.getResource("/testNode/A/test.txt/jcr:content");

我个人会将该资源调整为JCR节点( javax.jcr.Node )并从那里使用JCR API( #getProperty()# getBinary()),但这可能是我老派的成长经历。

答案 2 :(得分:1)

以下代码对我有用:

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

//skip here

Session session = (Session) resourceResolver.adaptTo(Session.class);
Node root = session.getRootNode();
Node jcrContent = root.getNode("testNode/A/test.txt/jcr:content");

InputStream is = jcrContent.getProperty("jcr:data").getBinary().getStream();

BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while (result != -1) {
    byte b = (byte) result;
    buf.write(b);
    result = bis.read();
}

System.out.println("plain text: " + buf.toString());

您也可以在another post

找到更多信息

答案 3 :(得分:0)

在AEM中,文件通常存储为资产。在这种情况下,您可以将相应的资源(以dam:Asset为主要类型的资源)适应资产,并通过以下方式从文件中读取:

InputStream inputStream = resource.adaptTo(Asset.class).getOriginal().getStream()

Tuan Dang的方法有效,但是所有JCR Node方法都抛出RepositoryException

Baeldung has a summary on how to convert input stream to a string