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 не является неявным объектом.