ResourceResolverFactory getServiceResourceResolver выбрасывает исключение в AEM 6.1

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

"Исключение при получении пользователя CRX для службы: 'writeService'.org.apache.sling.api.resource.LoginException: не удается получить имя пользователя для пакета group.tti.commons-service [395] и вспомогательной службы writeService"

Конфигурация OSGI:

enter image description here

Код в моем классе:

import javax.jcr.Session;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
....
@Reference
private ResourceResolverFactory factory;
private ResourceResolver resourceResolverWriter;
private static Session adminSession;
...
...
Map<String, Object> param = new HashMap<String, Object>();        
    param.put(ResourceResolverFactory.SUBSERVICE, "writeService");
try {
  resourceResolverWriter = factory.getServiceResourceResolver(param);            
  adminSession = resourceResolverWriter.adaptTo(Session.class);
...
} catch (LoginException e) {
...
}

Я ничего не теряю на AEM 6.1?

Ответ 1

С советом Джастина я попытался и нашел решение. Размещение сообщений может быть полезным для других.

Цель: записать данные/узлы в контент (особенно в /etc/userdata), когда пользователь входит в систему.

Мы можем достичь этого двумя способами (в любом случае, пользователь должен быть "системным пользователем")

Процесс 1:

Шаг 1: Использование встроенного системного пользователя в конфигурации OSGI. В OSGI выберите Apache Sling Service User Mapper Service.

group.abc.commons-service:writeService=oauthservice (где oauthservice - системный пользователь)

Шаг 2. Назначьте этому системному пользователю разрешения на доступ к папке с содержимым.

enter image description here

Вы видите пользователей системы в CRX по адресу: /home/users/system

Процесс 2:

Шаг 1: Создайте нового системного пользователя. Для этого откройте http://localhost: 4502/crx/explorer/index.jsp

1. Login as admin 
2. Open 'User Administration
3. Select 'Create System User'
4. Enter "user id"
5. Hit the Green button (you will not se a save button :)'

Я создал пользователя abcwriteservice

Шаг 2: Перейдите в раздел Разрешения, и для пользователя abcwriteservice предоставьте Разрешения на доступ к папке, в которую вы хотите написать. (В этом примере: /etc/userdata) enter image description here

Шаг 3: Откройте консоль OSGI и перейдите в службу сопоставления пользователей Apache Sling Service, чтобы определить сопоставление службы пользователя.

Пример: group.commons-service:writeService=abcwriteservice

enter image description here

Шаг 4: В коде я добавил дополнительный параметр, как:

Map<String, Object> param = new HashMap<String, Object>();
param.put(ResourceResolverFactory.SUBSERVICE, "writeService");

try {
    resourceResolverWriter = factory.getServiceResourceResolver(param);

    if (resourceResolverWriter == null)
        throw new Exception("Could not obtain a CRX User for the Service:'writeService'");

    Node usersRootNode = adminSession.getNode("/etc/userdata/users");
}

Ответ 2

В AEM 6.1 пользователи услуг должны быть пользователями системы, что фактически означает, что их node в JCR имеет тип rep: SystemUser. Эти пользователи не могут использоваться для входа в систему обычно, только по фоновым процессам. Пользователь admin - не системный пользователь, поэтому вы не можете использовать пользователя admin в качестве пользовательского пользователя службы. Вы должны создать нового пользователя системы и назначить им соответствующие разрешения.

Если вы хотите больше узнать об этом изменении, посмотрите https://issues.apache.org/jira/browse/SLING-3854.

Ответ 3

Кроме того, если вы планируете новую миграцию на AEM 6.2, подумайте об использовании ACS Commons, чтобы облегчить создание и доступность пользователей системы. Он устраняет весь этот ручной процесс, который может быть подвержен ошибкам.

https://adobe-consulting-services.github.io/acs-aem-commons/features/ensure-service-users/index.html

Ответ 4

создать сеанс вроде:

adminSession = resourceResolverWriter.adaptTo(Session.class);`

сделать сеанс, как показано ниже, надеюсь, что исключение входа не произойдет

final Session session;
session= resourceResolver.adaptTo(Session.class);

Это происходит потому, что resourceResolverWriter не является неявным объектом.