#osgi #aem #sling
#osgi #aem #sling
Вопрос:
У меня есть служба (расположенная внутри core / services) и реализация службы (расположенная core / services / impl).
У меня есть существующий класс (расположенный внутри core/ impl/ view /components), который расширяет com.adobe.cq.sightly.WCMUsePojo. Используя getSlingScripterHelper, этот класс может получить доступ к службе, о которой я упоминал выше.
Я пытаюсь получить доступ к службе без использования WCMUsePojo. Как я могу это сделать?
Спасибо!
Комментарии:
1. Мне любопытно, почему вы не хотите расширять wcmusepojo?
Ответ №1:
Вы можете получить службу непосредственно из реестра служб-
final Bundle bundle = FrameworkUtil.getBundle(this.getClass());
final BundleContext bundleContext = bundle.getBundleContext();
ServiceReference<MyService> ref = bundleContext.getServiceReference(MyService.class)
MyService myService = bundleContext.getService(ref);
// use the service
bundleContext.ungetService(ref);
Комментарии:
1. Имейте в виду, что любой подход к извлечению службы из реестра очень чувствителен к проблемам с синхронизацией. В OSGi служба может быть опубликована и не опубликована в любое время. Таким образом, у вас всегда может возникнуть проблема с тем, что getServiceReference или GetService возвращают значение null. Таким образом, вы должны защищать от null, а также должны справляться с отсутствием службы в потоке вашего кода. Как правило, безопаснее сделать ваш код компонентом DS и получить доступ к службе через ссылку.
Ответ №2:
Вы можете использовать @Reference
для вызова службы из любого другого класса без использования WCMUsePojo.
class MyClass
{
@Reference
private MyService myService;
void myMethod()
{
myServie.callYourServiceMethod();
}
}
Комментарии:
1. Это работает только в том случае, если
MyClass
это сама служба / компонент.
Ответ №3:
Если вы хотите получить доступ к службе из компонента поддержки HTL-скрипта, вы можете использовать модель Sling (вместо WcmUsePojo) и ввести ссылку на свою службу с помощью @Inject
аннотации.