当前位置: 首页 > 知识库问答 >
问题:

如何使用QueryBuilder Api检索资产的所有属性

范承志
2023-03-14

当我在AEM上使用下面的查询QueryDebug

path=/content/dam/we-retail  
type=dam:Asset  
p.limit=-1  
p.nodedepth=2  
p.hits=full  
p.guesstotal=true 

以及形成的URL/JSON QueryBuilder链接。

我可以看到每个资产的所有属性,包括jcr:内容,元数据如下:

我需要将相同的结果返回到服务/endpoint,我正在为客户构建AEM。当我将上述查询转换为查询生成器API时

queryParamsMap.put("type", "dam:Asset");  
queryParamsMap.put("p.limit", "-1");  
queryParamsMap.put("p.nodedepth", "2");  
queryParamsMap.put("p.hits", "full");  
queryParamsMap.put("p.guessTotal", "true");  

如何检索所有值?

SearchResult result = query.getResult();  
for (final Hit hit : result.getHits()) {  
  Resource resource = hit.getResource();  
  Asset asset = resource.adaptTo(Asset.class);  

如果我使用asset.get元数据(),我们只能看到jcr: content\元数据下的属性,而不能看到其他属性。

如果我使用ValueMap properties=resource。getValueMap() 我们可以检索所有资产属性(如jcr:path、jcr:primaryType等),但不能检索“元数据”。

有没有办法获取资产节点的所有值?


共有2个答案

吕霖
2023-03-14

从dam:asset节点本身到元数据节点(jcr:content/metadata)获取AEM资产的所有属性的另一种方法是使用Apache Sling模型,并将查询返回的每个资源调整到此模型。

例如:

@Model(adaptables=Resource.class)
public class MyAsset{

    @Inject
    @Named("jcr:created")
    private String createdDate;

    @Inject
    @Named("jcr:createdBy")
    private String createdBy;

    @Inject
    @Named("jcr:content/jcr:lastModified")
    @Optional
    private String lastModified;

    @Inject
    @Named("jcr:content/metadata/dc:title")
    @Optional
    private String title;

    @Inject
    @Named("jcr:content/metadata/dc:description")
    @Optional
    private String description;

    @PostConstruct
    protected void init() {
         // You can code here any task needed to be executed after all the injections of the model are done
    }

  //getters and setters...

}

请注意,您可以使用注释@命名来指定资源的任何后代节点的任何属性。

如果您需要资源的特定和少量属性,我建议您使用这种方法。如果你需要所有属性,我认为你找到的方法更好,因为你不需要创建一个模型来维护所有属性。

使用该模型,最终代码将是:

for (Hit hit : result.getHits()) {
      Resource resource = hit.getResource();
        if(resource!=null){
         MyAsset myAsset = resource.adaptTo(MyAsset.class);
        Logger.info("The asset {} was modified on {}", myAsset.getTitle(), myAsset.getLastModified());
        }
    }

有关吊索模型的更多信息,您可以参考:

https://sling.apache.org/documentation/bundles/models.html

查锦程
2023-03-14
匿名用户

经过一些研究,我找到了以下解决方案。张贴在这里供他人参考。

正如@Imran Saeed所提到的,在AEM中没有任何方法可以返回资产(或节点)的所有属性。我们必须结合起来做。

  1. 获取所有顶级属性(节点根级别)。其中包括jcr:createdjcr:createdBy,等等。
  2. 获取所有jcr:contentlevel属性。其中包括cq:namecq:lastModified,等等
  3. 获取所有jcr:content\metadatalevel属性。其中包括dc:title、任何自定义元数据等。
  4. 您可以将所有这些添加到另一个新的ValueMap,它可以保存特定节点/资产的所有属性

下面是一段代码片段:

Resource resource;
ValueMap mainProperties;
ValueMap assetMetadataProperties;
Resource metadataResource;
ValueMap jcrProperties;
Resource jcrdataResource;
ValueMap allProperties;

for (Hit hit : result.getHits()) {
        //LOGGER.info("\n********Hit path="+hit.getPath()+", title="+hit.getTitle());
        resource = hit.getResource();

        if(null!=resource){
            mainProperties = resource.getValueMap();

            // Add JCR Properties
            jcrdataResource = resource.getChild("jcr:content");
            jcrProperties = ResourceUtil.getValueMap(jcrdataResource);

            // Add Metadata properties
            metadataResource = resource.getChild("jcr:content/metadata");
            assetMetadataProperties = ResourceUtil.getValueMap(metadataResource);

            // Adding all togethe
            allProperties = new ValueMapDecorator(new HashMap());
            allProperties.putAll(hit.getProperties());
            allProperties.putAll(mainProperties); // Includes jcr:created createdDate etc.
            allProperties.put("jcr:path",hit.getPath()); //Add Path
            allProperties.putAll(jcrProperties);
            allProperties.putAll(assetMetadataProperties);

            //LOGGER.debug("All Asset Properties="+new Gson().toJson(allProperties));               
        }
    }

笔记

  1. jcr:path不会由上述任何一项返回。所以我必须使用hit显式地添加它。getPath
  2. 节点名称或资产名称可以从hit中提取。getTitle()。当然,这也是作为cq:name的一部分返回的
  3. 还有其他方法可以获得属性。另一种方法是获取节点并检索属性<代码>com。白天cq。搜索后果Hit有一个方法getNode(),它返回一个java。jcr。节点接口,您可以使用该get获取属性

 类似资料:
  • 我正在尝试从Twitter检索数据,使用Tweepy作为在命令行中键入的用户名。我想提取相当多关于状态和用户的数据,所以想出了以下内容: 请注意,我正在导入所有必需的模块,并且具有oauth键(只是此处未包含)并且文件名正确,刚刚更改: 我希望最终遍历用户的所有推文(最多3200条限制)。不过,首先要做的是。到目前为止,尽管我有两个问题,但我收到了以下关于转发的错误消息: 将用户名作为变量传递似乎

  • 如何在不创建多个字符串的情况下获得所有列和记录?假设我在那个表中有10列,我不需要把它存储到一个对象中 谢了。

  • 问题内容: 在我的阻止代码中,我试图以编程方式检索具有特定值属性的产品列表。 或者,如果不可能的话,将如何检索所有产品然后过滤它们以仅列出具有特定属性的产品? 如何使用标准布尔过滤器执行搜索或匹配产品的子集? 问题答案: 几乎所有的Magento模型都有一个对应的Collection对象,该对象可用于获取模型的多个实例。 要实例化产品集合,请执行以下操作 产品是Magento EAV样式的模型,因

  • 如何使用ArrayList检索Student类的单个属性,或者检查列表中是否存在“AAA ”?

  • 我不确定是否发现了一个bug,或者是否使用了错误的方法:我无法使用Graph检索DL组的所有者。 步骤: > 假设我的电子邮件是admin@contoso.com.我在Exchange服务器的Microsoft 365管理中心创建了一个通讯组列表组,并将自己(管理员)设置为该DL的所有者。我将这个DL命名为“TestDG1”。我还添加了这个用户作为DL的唯一成员。 然后我访问了Graph Expl

  • 我将一些数据存储为neo4j节点。此节点具有一些关联的C#类未描述的属性,因此在neo4jclient查询返回时不会自动映射回该类。 例如,这个C类: 存储在neo4j中,然后使用以下neo4jclient fluent代码检索: 将用名称和编号填充Node对象,但保留对CustomClass对象的空引用。 为了解决这个问题,我将CustomClass序列化为JSON字符串,并将其作为字符串属性存