JCR — EventListener — метод активации не найден — Adobe CQ 5.6.0

Я пытаюсь реализовать EventListener для распространения некоторых изменений JCR (свойство изменено, добавлен узел...).

Эта тема обсуждалась в нескольких сообщениях, но доступны разные реализации, и я склонен описывать мельчайшие детали требуемой аннотации как очень хорошо охраняемый секрет.

SlingRepository аннотирован без конкретных свойств в следующем документе: http://experiencedelivers.adobe.com/cemblog/en/experiencedelivers/2012/04/event_handling_incq.html

и аннотация компонента была установлена ​​следующим образом:

@Component
public class JCRListener implements EventListener{
}

С этой версией я могу установить свой пакет из веб-консоли Adobe CQ, но мои методы Active и Deactive не запускаются.

SlingRepository аннотирован определенными свойствами (policy = ReferencePolicy.STATIC, cardinality = ReferenceCardinality.MANDATORY_UNARY) в следующем документе: https://groups.google.com/forum/#!topicsearchin/day-communique/postEvent%7Csort:date%7Cspell:true/day-communique/BvJsgMzpsAM

и аннотация компонента имеет определенную настройку

@Component(immediate=true)
@Service
public class JCRListener implements EventListener{
    @Activate
    public void activate(ComponentContext componentContext){
      .... 
    } 
    @Deactivate
    public void deactivate(ComponentContext componentContext){
      .... 
    } 
    public void onEvent(EventIterator events) {
     .... 
    }
} 

С этим вариантом развертывание моего пакета завершается неудачно, и я получаю сообщение об ошибке [com.adobe.cq.JCRListener] метод активации [активировать] не найден; Компонент выйдет из строя

Любая помощь очень ценится.

Кстати, кто-нибудь знает статус сайта форума Adobe (http://help-forums.adobe.com/content/adobeforums/en.html)??? Мы склонны полагать, что веб-сайт не часто доступен ....

Вим


person Wim Van den Brande    schedule 02.04.2014    source источник
comment
не могли бы вы показать сгенерированный дескриптор xml для этой службы? обычно он находится под target/scr-plugin-generated/OSGI-INF   -  person santiagozky    schedule 03.04.2014


Ответы (2)


Смог решить эту проблему. Сигнатура методов активации и деактивации (или запуска и остановки) (обозначаемая ключевым словом аннотации Activate и Deactivate) должна соответствовать сигнатуре, которая нравится Феликсу (будучи контейнером OSGI с открытым исходным кодом) или с которой он согласен.

Для меня и AFAIK только эти подписи ПРАВИЛЬНЫ

@Activate
public void start() {
   .... add your Event Listeners 
} 

@Deactivate
public void stop() {
   .... remove your Event Listeners 
} 

и следующая подпись НЕПРАВИЛЬНА:

@Activate
public void start(ComponentContext ctx) {
   .... add your Event Listeners 
} 

@Deactivate
public void stop(ComponentContext ctx) {
   .... remove your Event Listeners 
} 

Помните о предупреждении, которое вы получаете при компиляции пакета. Если ваши подписи неверны, вы, скорее всего, получите следующее предупреждение:

[ПРЕДУПРЕЖДЕНИЕ] @Component: запуск метода жизненного цикла имеет неверный аргумент .... в аннотациях Java в com.adobe.cq.JCRListenerImp:25

Пожалуйста, обратитесь к ПРАВИЛЬНОЙ реализации JCR EventListener, достаточно хорошо задокументированной в следующем сообщении: http://cqdump.wordpress.com/2012/11/13/cq-coding-patterns-sling-vs-jcr-часть-2/

Я надеюсь, что этот ответ будет полезен для многих других людей.

с уважением,

Вим

person Wim Van den Brande    schedule 03.04.2014

Ваш код выглядит правильно, но импорт неправильного класса аннотаций Activate может вызвать эту ошибку.

http://markmail.org/message/eiqcgnckgd4mfbw7 содержит некоторую информацию о том, как решить эту проблему.

Вы также можете сравнить свой код и пакет с известным хорошим примером, таким как Пример ThumbnailGenerator.

person Bertrand Delacretaz    schedule 03.04.2014