Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AEM 6.3-使用OSGi R6注释创建事件处理程序_Java_Osgi_Aem_Sling - Fatal编程技术网

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

Java AEM 6.3-使用OSGi R6注释创建事件处理程序,java,osgi,aem,sling,Java,Osgi,Aem,Sling,我已经通过以下方法创建了一个事件处理程序,它运行良好。但是,我收到警告“添加的字段SlingConstants.TOPIC_RESOURCE_已弃用”。我进行了一些搜索,发现了以下线索: 以下是我面临的挑战: 1) 我想为我的事件处理程序创建一个单独的配置接口。我试过了,但不起作用 package com.aem.sites.interfaces; import org.apache.sling.api.SlingConstants; import org.osgi.service.event

我已经通过以下方法创建了一个事件处理程序,它运行良好。但是,我收到警告“添加的字段SlingConstants.TOPIC_RESOURCE_已弃用”。我进行了一些搜索,发现了以下线索:

以下是我面临的挑战:

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**********************");
    }
}

查看Sling9文档中的
org.apache.sling.api.SlingConstants
的Javadoc:

它特别告诉您添加的
主题\u资源\u
已被弃用:

不赞成。改为注册一个

阅读
ResourceChangeListener
的文档,此外,您还可以查看来自ACS示例的:

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

此外,这里还有来自sling项目和


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

谢谢@Ahmed的回复。我已经添加了更新的代码。如果您认为合适的话,请看一看并提出修改建议好吗?@user972418您看到问题了吗?它不起作用吗?乍一看,它似乎没什么问题。它没有抛出任何错误,也不起作用。我觉得还有一件事是,我通过实现ResourceChangeListener而不是EventHandler改变了实现。我现在还有一个问题,什么时候应该使用事件处理程序,什么时候应该使用事件侦听器?这有什么区别?对不起,问题太多了。嗨,对不起,我没有时间看代码,我用sling repo的resourceChangeListener示例更新了我的答案。还有一件事。在ResourceChange类上,getAddedPropertyNames()等方法已被弃用。如果我想知道节点上已更改的属性,您建议我应该怎么做。
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"};

}