3

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

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

4 回答 4

12

您提到您使用的是 Sling 资源 API 而不是 JCR API。您可以将资源直接从 Resource 调整为 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/吊索/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java

于 2013-06-10T08:23:32.000 回答
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());

您也可以在另一个帖子中找到更多信息

于 2013-06-05T18:33:12.560 回答
1

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

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

我会亲自将该资源改编为 JCR 节点 ( javax.jcr.Node ) 并从那里使用 JCR API ( #getProperty() , #getBinary() ),但这可能是我的老学校教育。

于 2013-06-05T07:54:48.557 回答
0

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

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

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

Baeldung 总结了如何将输入流转换为字符串

于 2019-06-04T16:52:23.940 回答