Aem 无法通过ValueMap-CQ 5.4检索属性值

Aem 无法通过ValueMap-CQ 5.4检索属性值,aem,jcr,sling,Aem,Jcr,Sling,我在尝试访问上述资源的属性时意外遇到了一种情况 如果属性的名称以数字开头,则ValueMap始终返回null,而通过节点API访问同一属性则正确返回值 试图通过#keySet()和#containsKey()检查该键在ValueMap中是否可用。它显示所有键,但对应于键的值为空 下面是我试图执行的一段代码 Iterator<Resource> resources = resourceResolver.findResources(query, "xpath"); while(reso

我在尝试访问上述资源的属性时意外遇到了一种情况

如果属性的名称以数字开头,则
ValueMap
始终返回
null
,而通过节点API访问同一属性则正确返回值

试图通过
#keySet()
#containsKey()
检查该键在ValueMap中是否可用。它显示所有键,但对应于键的值为空

下面是我试图执行的一段代码

Iterator<Resource> resources = resourceResolver.findResources(query, "xpath");

while(resources.hasNext()) {
    Resource res = resources.next();
    ValueMap resProps = res.adaptTo(ValueMap.class);
    String xyz = resProps.get("2014_xyz",String.class); // returns null

    Node node = res.adaptTo(Node.class);
    if(node.hasProperty("2014_xyz")) {
        String abc = node.getProperty("2014_xyz").getString(); //returns value
    }
}
Iterator resources=resourcesolver.findResources(查询,“xpath”);
while(resources.hasNext()){
Resource res=resources.next();
ValueMap resProps=res.adapto(ValueMap.class);
String xyz=resProps.get(“2014_xyz”,String.class);//返回null
Node Node=res.adapto(Node.class);
if(节点hasProperty(“2014_xyz”)){
字符串abc=node.getProperty(“2014_xyz”).getString();//返回值
}
}
是否有任何限制,财产名称不应以数字开头

我仔细阅读了第3.2.2节,以检查有效名称。它将有效字符表示为
XmlChar–InvalidChar
,其中
XmlChar
是与当前生成的字符相匹配的任何字符

他们还考虑了文件中提到的内容吗?如果是这样的话,为什么JCR允许使用这样的名称并正确返回值

或者,这与Sling的实施有关吗?我是不是遗漏了什么

附言:我在CQ5.6.1中测试了同样的功能,ValueMap在那里似乎运行良好。不确定CQ 5.5。

试试看

resProps.get("2014_xyz", "")

还要确保您引用的吊索版本与cq匹配。我不太确定您的具体情况,但如果用于编译的版本与服务器上的版本不匹配,我会看到类似的问题。

如果这在CQ 5.6.1中起作用,它看起来像是一个同时已修复的错误,JCR属性名以数字开头没有问题


您可能需要检查
2014_xyz
属性的实际数据类型,可能存在上游转换,这与您的想法不同。

当另一个签名失败时,为什么这个签名会起作用?这不只是返回一个空字符串而不是
null
?我不是在批评答案,我只是好奇关于这是如何不同的。关于不同Sling版本的观点听起来很有趣。@batavia正如tom提到的,这只会返回一个空字符串。我也直接在服务器上编译它。这正是我们在代码中一直使用的。为什么一个可以工作,另一个不能工作的原因是如果第二个调用在更新的Sling API中n正在被使用。(和/或为了避免bug)我不确定我们一直都在使用它,因为有bug,或者因为我们团队的知识不完整。尽管如此,还是值得一试