代码之家  ›  专栏  ›  技术社区  ›  user972418

AEM 6.3-使用OSGi R6注释创建事件处理程序

  •  1
  • user972418  · 技术社区  · 7 年前

    https://github.com/nateyolles/aem-osgi-annotation-demo/blob/master/core/src/main/java/com/nateyolles/aem/osgiannotationdemo/core/listeners/SampleOsgiResourceListener.java 而且效果很好。但是,我收到警告“添加的字段SlingConstants.TOPIC\u RESOURCE\u已弃用”。我搜索了一下,发现了这个帖子: 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"};
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Ahmed Musallam    7 年前

    查看Javadoc org.apache.sling.api.SlingConstants 在吊索9文件中: http://sling.apache.org/apidocs/sling9/org/apache/sling/api/SlingConstants.html

    它明确地告诉你 TOPIC_RESOURCE_ADDED

    已弃用。注册a ResourceChangeListener 相反

    阅读以下文档: ResourceChangeListener 此外,您可以查看 sample SCR service impl 来自ACS样本:

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

    此外,以下是sling项目的两个示例 ResourceBackedPojoChangeMonitor OsgiObservationBridge