当我在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等),但不能检索“元数据”。
有没有办法获取资产节点的所有值?
从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
经过一些研究,我找到了以下解决方案。张贴在这里供他人参考。
正如@Imran Saeed所提到的,在AEM中没有任何方法可以返回资产(或节点)的所有属性。我们必须结合起来做。
jcr:created
,jcr:createdBy
,等等。jcr:content
level属性。其中包括cq:name
,cq:lastModified
,等等jcr:content\metadata
level属性。其中包括dc:title
、任何自定义元数据等。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));
}
}
笔记
jcr:path
不会由上述任何一项返回。所以我必须使用hit显式地添加它。getPath
cq:name
的一部分返回的
节点
并检索属性<代码>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字符串,并将其作为字符串属性存