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

时间:2018-05-22 23:59:28

标签: aem query-builder

当我在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:content,元数据如下:

enter image description here

我需要将相同的结果返回给服务/端点我在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.getMetadata(),我们只能看到jcr:content\metadata下的属性,而不会看到其他属性。

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

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

1 个答案:

答案 0 :(得分:0)

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

例如:

@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...

}

注意您可以使用注释@Named指定资源的任何后代节点的任何属性。

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

使用该模型的最终代码为:

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());
        }
    }

有关Sling Model的更多信息,请参阅:

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