我在尝试访问资源属性时偶然遇到了一种情况in this Sling Docs。
如果属性的名称以数字开头,ValueMap
总是返回null
,而通过Node API访问相同的属性会正确返回值。
尝试通过#keySet()
和#containsKey()
检查ValueMap中的密钥是否可用。它显示所有键,但键对应的值为null。
以下是我试图执行的一段代码。
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
}
}
是否有任何限制,财产的名称不应该以数字开头?
我通过JCR repository model第3.2.2节检查有效名称。它将有效字符称为XmlChar – InvalidChar
,其中XmlChar
是与http://www.w3.org/TR/xml/#NT-Char处的字符集生成匹配的任何字符
他们是否也考虑了文件中提到的Common Syntactic Constructs?如果是这样,为什么JCR允许使用这些名称以及正确返回值?
或者,这与Sling的实施有关吗?我在这里错过了什么吗?
P.S:我在CQ 5.6.1中测试了相同的内容,而ValueMap似乎在那里工作得很好。不确定CQ 5.5。
答案 0 :(得分:0)
尝试
resProps.get("2014_xyz", "")
还要确保您引用的吊索版本是匹配cq的版本。我对你的具体情况不太确定,但如果用于编译的版本与服务器上的版本不匹配,我也会遇到类似的问题。
答案 1 :(得分:0)
如果这在CQ 5.6.1中有效,它看起来像是在此期间修复的错误,那么以数字开头的JCR属性名称没有任何问题。
您可能想要检查2014_xyz
属性的实际数据类型,可能存在上游转换,使其与您的想法不同。