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

时间:2014-08-01 16:32:49

标签: cq5 jcr sling

我在尝试访问资源属性时偶然遇到了一种情况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。

2 个答案:

答案 0 :(得分:0)

尝试

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

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

答案 1 :(得分:0)

如果这在CQ 5.6.1中有效,它看起来像是在此期间修复的错误,那么以数字开头的JCR属性名称没有任何问题。

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