2017-10-08 8 views
0

Ich versuche, einen OSGi Service mit OSGi R6 Anmerkungen zu erstellen und sie dann in der Schlinge Modellklasse wie diese Injektion:AEM 6.3 Verwendung OSGi R6 Anmerkungen und Sling Modelle

package com.aem.sites.models; 

import javax.annotation.PostConstruct; 
import javax.inject.Inject; 

import org.apache.sling.api.resource.Resource; 
import org.apache.sling.models.annotations.Model; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import com.aem.sites.services.WeatherService; 

@Model(adaptables=Resource.class) 
public class Banner { 

    final static Logger logger = LoggerFactory.getLogger(Banner.class); 

    @Inject 
    private WeatherService weatherService; 

    private String message; 

     @PostConstruct 
     public void init() { 
      logger.info("##############################################################calling the init method"); 
      message = weatherService.getName(); 
     } 

     public String getMessage() { 
      logger.info("##############################################################inside the get message method"); 
      return message; 
     } 

} 

Die OSGi-Konfigurationsschnittstelle wie folgt aussieht :

package com.aem.sites.interfaces; 

import org.osgi.service.metatype.annotations.AttributeDefinition; 
import org.osgi.service.metatype.annotations.AttributeType; 
import org.osgi.service.metatype.annotations.ObjectClassDefinition; 

@ObjectClassDefinition(name = "Configuration", description = "Configuration file") 
public @interface Configuration { 

    @AttributeDefinition(
       name = "String Property", 
       description = "Sample String property", 
       type = AttributeType.STRING 
      ) 
    public String getText() default "It's a test"; 
} 

und die Service-Klasse sieht wie folgt aus:

package com.aem.sites.services.impl; 


import org.osgi.service.component.annotations.Activate; 
import org.osgi.service.component.annotations.Component; 
import org.osgi.service.component.annotations.Deactivate; 
import org.osgi.service.component.annotations.Modified; 
import org.osgi.service.component.annotations.ConfigurationPolicy; 
import org.osgi.service.metatype.annotations.Designate; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 


import com.aem.sites.interfaces.Configuration; 
import com.aem.sites.services.WeatherService; 

@Component(service=WeatherService.class, 
immediate=true, 
configurationPid = "com.aem.sites.services.impl.WeatherServiceImpl", 
configurationPolicy=ConfigurationPolicy.REQUIRE 
) 
@Designate(ocd = Configuration.class) 
public class WeatherServiceImpl implements WeatherService{ 

    final static Logger logger =LoggerFactory.getLogger(WeatherServiceImpl.class); 

    private Configuration config; 

    private String name; 

    @Activate 
    @Modified 
    protected final void activate(Configuration configuration) { 
     logger.info("##############################################################calling activate method inside the weather service impl class"); 
     this.config = configuration; 
     name = config.getText(); 
    } 

    @Deactivate 
    protected void deactivate() { 
    } 

    @Override 
    public String getName() { 
     logger.info("##############################################################calling get name method inside the weather service impl class"); 
     return name; 
    } 
} 

und fin verbünden die Service-Schnittstelle:

package com.aem.sites.services; 

public interface WeatherService { 

    public String getName(); 

} 

Ich versuche, das Sling Modell Pojo in der HTL Klasse wie folgt zu verwenden:

<sly data-sly-use.banner="com.aem.sites.models.Banner"> 

    <div class="inner"> 
     <h2>${banner.message}</h2 

    </div> 

</sly> 

Aber ich bin nicht imstande, alle Texte zu sehen. Ich habe die logger.info verwendet, kann sie aber auch nicht in den Log-Dateien sehen. Ich bin mir sicher, dass ich hier etwas sehr falsch mache, aber nicht in der Lage zu lokalisieren, da ich gerade angefangen habe mit OSGi R6 Annotationen und Sling Models zu spielen. Jede Hilfe wird geschätzt.

Hinzufügen von Maven Abhängigkeiten:

Eltern pom.xml

<!-- <plugin> 
        <groupId>org.apache.felix</groupId> 
        <artifactId>maven-bundle-plugin</artifactId> 
        <version>2.5.3</version> 
       </plugin> -->    
       <plugin> 
         <groupId>org.apache.felix</groupId> 
         <artifactId>maven-bundle-plugin</artifactId> 
         <version>3.3.0</version> 
         <inherited>true</inherited> 
       </plugin> 

<dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.service.component.annotations</artifactId> 
       <version>1.3.0</version> 
       <scope>compile</scope> 
      </dependency> 

      <dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.annotation</artifactId> 
       <version>6.0.0</version> 
      </dependency> 

      <dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.service.metatype.annotations</artifactId> 
       <version>1.3.0</version> 
      </dependency> 

Kern pom.xml

<dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.service.component.annotations</artifactId> 
      </dependency> 
      <dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.annotation</artifactId> 
      </dependency> 
      <dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.service.metatype.annotations</artifactId> 
      </dependency> 

<plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-SymbolicName>com.aem.site.aem-site</Bundle-SymbolicName> 
         <Sling-Model-Packages> 
          com.aem.sites.models 
         </Sling-Model-Packages> 
         <Import-Package>javax.inject;version=0.0.0,*</Import-Package> 
        </instructions> 
       </configuration> 
      </plugin> 
+0

In Ihr Modell: Können Sie '@ Inject' durch' @OSGiService' ersetzen? In der offiziellen Dokumentation wurde das '@ Inject' für ein Modell verwendet, das von' SlingHttpServletRequest' adaptiert wurde. Sie passen sich von 'Resource' an. Dies könnte einen Unterschied machen, obwohl ich mir nicht 100% ig sicher bin. – Jens

Antwort

1

Im Service-impl Sie service=WeatherServiceImpl.class gesetzt haben, die falsch ist, sollte es sein, die Name der Serviceschnittstelle.

so, in WeatherServiceImpl

ändern
@Component(service=WeatherServiceImpl.class, 

zu

@Component(service=WeatherService.class, 

..

EDIT: auch configurationPolicy=ConfigurationPolicy.REQUIRE bedeutet, dass es für den DS mindestens eine Config sein sollte, um Komponente aktiv sein. (config from code wird nicht funktionieren)

also können Sie zu system /system/console/configMgr/com.aem.sites.services.impl.WeatherServiceImpl gehen und einen Wert eingeben und speichern. oder du kannst configurationPolicy auf optional setzen und dein Code wird ohne config funktionieren.

+1

Vielen Dank für die Antwort. Das hat sich aber schon nichts geändert. – user972418

+0

Ich habe den Beitrag bearbeitet, um die Änderungen in den beiden Pom-Dateien aufzunehmen. Bitte guck dir das an. Vielen Dank. – user972418

+0

das ist seltsam. Ich habe 6.3 versucht und war in der Lage, die Nachrichtenausgabe in Sicht zu bekommen. Ich habe jedoch die folgenden Änderungen vorgenommen: 1. Ändern Sie die Paketnamen so, dass sie mit meinen Sandbox-Einstellungen übereinstimmen. 2. Ersetzte log4j Logger durch slf4j Logger – awd

0

Um die Riemen-Modelle zur Verfügung stellen Sie richtig <Sling-Model-Packages> Abschnitt des maven-bundle-plugin konfigurieren müssen, finden Sie https://sling.apache.org/documentation/bundles/models.html#basic-usage

können Sie die Modelle richtig belichtet überprüfen, indem man die Hebegurtmodelle Web Console: http://localhost:4502/system/console/status-slingmodels

+0

Vielen Dank für die Antwort. Denken Sie, dass der Abschnitt nicht korrekt konfiguriert ist? Im selben Paket, d. H. , habe ich andere Klassen von Schlingenmodellen, und sie scheinen gut zu funktionieren. Aber dies ist eine Klasse, die nicht wie erwartet funktioniert. Ich habe auch versucht mit WCMUsePojo, aber auch das hat nicht funktioniert. Also, ich weiß nicht, ob die pom.xml einige Probleme oder etwas anderes hat. – user972418

+0

Das neueste Update des 'pom.xml' Fragments sieht gut aus. Ich habe überprüft und es funktioniert auf AEM 6.3. Ich vermute, dass Sie das HTL-Skript nicht korrekt einbinden, versuchen Sie, ein minimales HTL-Skript mit dem obigen Snippet unter '/ apps/test/banner/banner.html' und einen Knoten unter'/content/test' mit 'sling zu definieren: resourceType = test/banner' und sehen, dass es korrekt gerendert wird unter '/ content/test.html' – Vlad

+0

Können Sie das Projekt korrekt erstellen? Ich frage das, weil ich einige Probleme mit Maven Build beobachtet habe. https://StackOverflow.com/questions/46659511/aem-6-3-maven-build-is-successful-but-still-doesnt-install-all-the-content – user972418

Verwandte Themen