【问题标题】:Unable to retrieve property value through ValueMap - CQ 5.4无法通过 ValueMap 检索属性值 - CQ 5.4
【发布时间】:2014-08-01 16:32:48
【问题描述】:

我在尝试访问in this Sling Docs提到的资源属性时不小心遇到了一个情况。

如果属性名称以数字开头,ValueMap 总是返回 null,而通过 Node API 访问相同的属性会正确返回值。

尝试通过#keySet()#containsKey() 检查该键是否在ValueMap 中可用。显示了所有的key,但是key对应的value是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。

【问题讨论】:

    标签: aem jcr sling


    【解决方案1】:

    试试

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

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

    【讨论】:

    • 为什么当另一个签名失败时这个签名会起作用?这不只是返回一个空字符串而不是null吗?我不是在批评答案,我只是好奇这有什么不同。关于不同 Sling 版本的观点听起来很有趣。
    • @batavia 正如汤姆所说,这只会返回一个空字符串。也直接在服务器上编译。
    • 这正是我们在代码中一直使用的。一个可以工作而另一个不能工作的原因是,如果第二个调用是在一个比正在使用的更新的 sling API 中。 (和/或避免错误)我不确定我们是否一直在使用它,因为错误或我们团队中的知识不完整。仍然值得一试
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2012-03-23
      • 2017-01-28
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多