我试图实现一个EventListener来传播一些JCR更改(属性已更改,节点已添加...)。
这个主题已经在很多帖子中进行了讨论,但是可以使用不同的实现,并且我倾向于将所需注释的细节详细描述为一个非常保密的秘密。
SlingRepository在以下文档中没有特定属性进行注释:http://experiencedelivers.adobe.com/cemblog/en/experiencedelivers/2012/04/event_handling_incq.html
和Component注释已按以下方式设置:
@Component
public class JCRListener implements EventListener{
}
有了这种风格,我可以从Adobe CQ Web控制台安装我的软件包,但不会触发我的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注释具有特定设置
@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)???我们倾向于认为该网站不常用....Wim
答案 0 :(得分:1)
能够解决此问题。 activate和deactivate(或start和stop)方法的签名(由Activate和Deactivate annotation关键字标识)应该与签名Felix(作为开源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:生命周期方法启动有错误的参数....在com.adobe.cq.JCRListenerImp中的Java注释:25
请参阅以下帖子中记录的JCR EventListener的CORRECT实现: http://cqdump.wordpress.com/2012/11/13/cq-coding-patterns-sling-vs-jcr-part-2/
我希望这个答案对许多其他人有所帮助。
问候,
Wim
答案 1 :(得分:0)
您的代码看起来正确但导入错误的Activate annotations类可能会导致此错误。
http://markmail.org/message/eiqcgnckgd4mfbw7有一些关于如何解决此问题的信息。
您可能还想将您的代码和捆绑包与一个已知的好示例进行比较,例如Sling的ThumbnailGenerator sample。