【问题标题】:AEM 6.3 - Creating Event handler using OSGi R6 annotationsAEM 6.3 - 使用 OSGi R6 注释创建事件处理程序
【发布时间】:2018-04-06 21:14:54
【问题描述】:

我按照https://github.com/nateyolles/aem-osgi-annotation-demo/blob/master/core/src/main/java/com/nateyolles/aem/osgiannotationdemo/core/listeners/SampleOsgiResourceListener.java 创建了一个事件处理程序,它工作正常。但是,我收到警告“SlingConstants.TOPIC_RESOURCE_ADDED 字段已弃用”。我做了一些搜索,发现了这个线程:https://forums.adobe.com/thread/2325819

以下是我面临的挑战:

1) 我想为我的事件处理程序创建一个单独的配置接口。我试过了,它不起作用

package com.aem.sites.interfaces;

import org.apache.sling.api.SlingConstants;
import org.osgi.service.event.EventConstants;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Temperature Listener Configuration")
public @interface TemperatureListenerConfiguration {

    @AttributeDefinition(
            name = EventConstants.EVENT_FILTER,
            description = "Configurable paths for temperature event listener",
            type = AttributeType.STRING
            )
    String getPaths() default "/content/aemsite/en/jcr:content/root/responsivegrid/banner";

    @AttributeDefinition(
            name = EventConstants.EVENT_TOPIC,
            description = "Event types",
            type = AttributeType.STRING
            )
    String[] getEventTypes() default  {SlingConstants.TOPIC_RESOURCE_ADDED,SlingConstants.TOPIC_RESOURCE_CHANGED, SlingConstants.TOPIC_RESOURCE_REMOVED};

}

package com.aem.sites.listeners;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aem.sites.interfaces.TemperatureListenerConfiguration;

@Component(immediate=true,
service=EventHandler.class,
configurationPid = "com.aem.sites.listeners.EventHandler")
@Designate(ocd=TemperatureListenerConfiguration.class)
public class TemperaturePropertyListener implements EventHandler{

     private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void handleEvent(Event event) {
        logger.info("*********************Event handler*****************************");

    }

    @Activate
    @Modified
    public void activate(TemperatureListenerConfiguration config) {
        //config.getPaths();
        logger.info("**************************TemperaturePropertyListener******************activate**********************");
    }

}

我还想要 SlingConstants 已弃用问题的解决方案。不确定 ResourceChangeListener 是否是我的问题的答案,如果是,那么代码中的所有内容将如何协同工作。

提前致谢

================================ 最新代码

package com.aem.sites.listeners;

import java.util.List;

import org.apache.sling.api.resource.observation.ResourceChange;
import org.apache.sling.api.resource.observation.ResourceChangeListener;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aem.sites.interfaces.TemperatureListenerConfiguration;


@Component(immediate=true,
service=ResourceChangeListener.class,
configurationPid = "com.aem.sites.listeners.TemperaturePropertyListener")
@Designate(ocd=TemperatureListenerConfiguration.class)
public class TemperaturePropertyListener implements ResourceChangeListener{

     private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void onChange(List<ResourceChange> changes) {
        for (final ResourceChange change : changes) {
            logger.info("**************************TemperaturePropertyListener******************change type**********************"+change.getType());
        }

    }


    @Activate
    @Modified
    public void activate(TemperatureListenerConfiguration config) {
        //config.getPaths();
        logger.info("**************************TemperaturePropertyListener******************activate**********************");
    }
}

界面

package com.aem.sites.interfaces;

import org.apache.sling.api.resource.observation.ResourceChangeListener;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Temperature Listener Configuration")
public @interface TemperatureListenerConfiguration {

    @AttributeDefinition(
            name = ResourceChangeListener.PATHS,
            description = "Configurable paths for temperature event listener",
            type = AttributeType.STRING
            )
    String[] getPaths() default {"/content/aemsite/en/jcr:content/root/responsivegrid/banner"};

    @AttributeDefinition(
            name = ResourceChangeListener.CHANGES,
            description = "Event types",
            type = AttributeType.STRING
            )
    String[] getEventTypes() default  {"ADDED","REMOVED","CHANGED","PROVIDER_ADDED", "PROVIDER_REMOVED"};

}

【问题讨论】:

    标签: java osgi aem sling


    【解决方案1】:

    在此处查看 sling 9 文档中 org.apache.sling.api.SlingConstants 的 Javadoc:http://sling.apache.org/apidocs/sling9/org/apache/sling/api/SlingConstants.html

    它明确告诉您TOPIC_RESOURCE_ADDED 已被弃用:

    已弃用。改为注册ResourceChangeListener

    阅读ResourceChangeListener 的文档,此外,您还可以查看来自ACS Samples 的sample SCR service impl

    将其转换为 R6 声明式服务应该不难。

    另外,这里有两个来自 sling 项目 ResourceBackedPojoChangeMonitorOsgiObservationBridge 的例子

    尝试用同一类中的属性来模仿那些类。

    【讨论】:

    • 感谢@Ahmed 的回复。我已经添加了更新的代码。如果您认为合适,请您看一下并提出任何更改建议吗?
    • @user972418 你看到问题了吗?它不工作吗?乍一看,我觉得没问题。
    • 它没有抛出任何错误,也没有工作。我感觉的另一件事是,我通过实现 ResourceChangeListener 而不是 EventHandler 改变了实现。我现在还有一个问题是什么时候应该使用 Event Handler 以及什么时候应该使用 Event Listener ?它有什么区别?抱歉问了太多问题。
    • 嗨,对不起,我没有时间看代码,我用 sling repo 中的示例 resourceChangeListener 更新了我的答案。
    • 还有一件事。在 ResourceChange 类上,方法 getAddedPropertyNames() 和更多方法已被弃用。如果我想知道节点上更改的属性,您建议我应该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2018-04-27
    • 2013-08-15
    相关资源
    最近更新 更多