2017-10-25 3 views
1

Ich habe einen Event-Handler erstellt, indem Sie https://github.com/nateyolles/aem-osgi-annotation-demo/blob/master/core/src/main/java/com/nateyolles/aem/osgiannotationdemo/core/listeners/SampleOsgiResourceListener.java folgen und es funktioniert gut. Ich bekomme jedoch die Warnung "Das Feld SlingConstants.TOPIC_RESOURCE_ADDED ist veraltet". Ich habe einige der Suche und fand diesen Thread: https://forums.adobe.com/thread/2325819AEM 6.3 - Erstellen von Ereignishandler mit OSGi R6 Annotationen

Hier sind die Herausforderungen, die ich bin vor:

1) ich eine separate Konfigurationsschnittstelle für mein Event-Handler erstellen möchten. Ich habe das versucht und es funktioniert nicht

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

} 

Ich möchte auch die Lösung für SlingConstants veraltetes Problem. Nicht sicher, ob ResourceChangeListener die Antwort auf mein Problem ist und wenn ja, wie alles im Code zusammenarbeitet.

Vielen Dank im Voraus

=============================== neuesten Code

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

die Schnittstelle

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

} 

Antwort

1

am Javadoc der Suche nach org.apache.sling.api.SlingConstants 9 Dokumentation hier im Riemen: http://sling.apache.org/apidocs/sling9/org/apache/sling/api/SlingConstants.html

informiert Sie speziell, dass TOPIC_RESOURCE_ADDED veraltet ist:

Veraltet. Registrieren

ein ResourceChangeListener statt

Lesen Sie die Dokumentation für ResourceChangeListener zusätzlich Sie einen Blick auf einem sample SCR service impl von ACS Proben nehmen:

Es soll nicht schwer sein zu lassen, die zu R6 deklarativem Service.

Auch hier sind zwei Beispiele aus der Schlinge Projekt ResourceBackedPojoChangeMonitor und OsgiObservationBridge

versuchen, diese Klassen mit den Eigenschaften in der gleichen Klasse zu imitieren.

+0

Vielen Dank @Ahmed für die Antwort. Ich habe den aktualisierten Code hinzugefügt. Können Sie es sich bitte ansehen und Änderungen vorschlagen, wenn Sie es für angemessen halten? – user972418

+0

@ user972418 Sehen Sie Probleme? Funktioniert es nicht? es scheint mir auf den ersten Blick in Ordnung zu sein. –

+0

Es wirft keine Fehler auf und es funktioniert nicht. Eine weitere Sache ist meiner Meinung nach, dass ich die Implementierung geändert habe, indem ich ResourceChangeListener anstelle von EventHandler implementiert habe. Eine weitere Frage, die ich jetzt habe, ist wann sollte ich Event Handler verwenden und wann sollte ich Event Listener verwenden? Welchen Unterschied macht es ? Entschuldigung für zu viele Fragen. – user972418

Verwandte Themen