以编程方式设置cq:tags将空白值保存在AEM中的节点中

问题描述 投票:2回答:1

我正在尝试以编程方式从json字符串中提取数据,转换为字符串数组,并将其作为cq:tags属性和对应的值添加到节点中,但是,当我这样做时,虽然添加了[[cq:tags属性,但带有空白值。

我的节点是这样的:/content/<my project node>/ContentPage/jcr:content

ResourceResolver resolver = CommonUtils.getResourceResolver(resourceResolverFactory); String[] strValue = tagList.stream().toArray(String[]::new); // tagList has String values in form of array. Resource resource = resolver.getResource(CONTENT_DATA_NODE); if (resource != null) { Node node = resource.adaptTo(Node.class); if (node != null) { NodeIterator nodeIterator = node.getNodes(); while (nodeIterator.hasNext()) { innerNode = nodeIterator.nextNode(); innerNode.setProperty(CQ_TAGS, strValue); innerNode.getSession().save(); } } }

并且我的吊索用户映射器服务为mybundle.core:datawrite=userdatawriter,而且如果我的资源resolverfactory为null,我也会直接从请求中获取解析器。

起初,我认为这可能是访问问题,所以我以编程方式尝试使用任何随机属性和值:属性:

xyz

,值:aa,bb,cc,dd这是由我的代码编写的,没有任何问题,仅当以编程方式添加cq:tags时才出现问题。尽管我可以从页面属性或在crxde节点本身中手动添加带有任何长值列表的cq:tags而不出现任何问题。 我在这里缺少什么并且在代码中做错了,它不仅可以添加cq:tags,而且如果存在cq:tags也可以覆盖。

P.S:我的AEM版本是AEM 6.5 SP2

aem aem-6
1个回答
1
投票
我可以看到在AEM 6.4.3中也发生了同样的事情。保存属性后,可以立即读取该值。这是我在AEM Groovy console中运行的几个简单示例。

def node = getNode('/content/screens/we-retail/apps/virtual-showroom/en/jcr:content') String[] arr = ['a', 'b', 'c']; String[] tagArr = ['we-retail:equipment', 'we-retail:activity/biking'] node.setProperty('foo', arr) println node.getProperty('foo').values // prints the a, b,c tags node.setProperty('cq:tags', tagArr) session.save() println node.getProperty('cq:tags').values // prints the a, b,c tags println node.getProperty('foo').values // prints the a, b,c tags

但是,在检查CRXDE中的页面后,我看到该属性为空。当您使用的值与AEM中的现有标签匹配时,不会发生这种情况。例如:

def node = getNode('/content/screens/we-retail/apps/virtual-showroom/en/jcr:content') String[] arr = ['a', 'b', 'c']; String[] tagArr = ['we-retail:equipment', 'we-retail:activity/biking'] node.setProperty('foo', arr) println node.getProperty('foo').values node.setProperty('cq:tags', tagArr) println node.getProperty('cq:tags').values // prints the we-retail tags session.save() println node.getProperty('foo').values println node.getProperty('cq:tags').values // prints the we-retail tags

并且相同的值在CRXDE中可见。

我相信,此行为是由

Day CQ Tagging Service(com.day.cq.tagging.impl.JcrTagManagerFactoryImpl

控制的>enter image description here

取消选中此框将禁用验证,并允许您保留这些值。但是,使用不存在的标签标记页面会导致其自身的问题。相反,我建议确保在使用它们之前确保创建这些标签。

© www.soinside.com 2019 - 2024. All rights reserved.