программная настройка тегов cq: сохраняет пустое значение в узле в AEM - PullRequest
3 голосов
/ 30 января 2020

Я пытаюсь программно извлечь данные из строки 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 is null, я получаю resolver из запроса напрямую.

Первоначально я думал, что это может быть проблема с доступом, поэтому я программно попытался с любым случайным свойством и значением: property: xyz , значения: aa, bb, cc, dd То, что написано моим кодом без каких-либо проблем, только при программном добавлении cq: tags , когда возникает проблема. Хотя я могу добавить теги cq: с любым длинным списком значений вручную без каких-либо проблем, будь то из свойств страницы или в самом узле crxde.

Что мне здесь не хватает и что я делаю неправильно в коде, который может не только добавлять теги cq: но и перезаписывать, если теги cq: существуют.

PS: моя версия AEM - AEM 6.5 SP2

1 Ответ

1 голос
/ 30 января 2020

Я вижу, что то же самое происходит в AEM 6.4.3. Сразу после сохранения свойства значение можно прочитать, как и ожидалось. Вот несколько быстрых примеров, которые я запустил в консоли AEM Groovy .

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

Снятие флажка отключит проверку и позволит вам сохранить эти значения. Однако пометка страницы несуществующими тегами вызовет свою долю проблем. Вместо этого я бы предложил создать эти теги перед их использованием.

...