2017-10-08 5 views
0

Je suis en train de créer un service OSGi utilisant des annotations OSGi R6, puis l'injecter dans la classe modèle Sling comme ceci:AEM 6.3 Utilisation OSGi R6 annotations et modèles de harnais

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

} 

L'interface de configuration OSGi ressemble à ceci :

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

et la classe de service ressemble à ceci:

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

et fin allier l'interface de service:

package com.aem.sites.services; 

public interface WeatherService { 

    public String getName(); 

} 

Je suis en train d'utiliser le modèle Sling Pojo dans la classe HTL comme ceci:

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

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

    </div> 

</sly> 

Mais je ne suis pas en mesure de voir des textes. J'ai utilisé le logger.info mais je ne peux pas le voir dans les fichiers journaux non plus. Je suis sûr que je suis en train de faire quelque chose de très mal ici mais que je n'arrive pas à trouver puisque je viens de commencer à jouer avec les annotations OSGi R6 et les modèles Sling. Toute aide est appréciée.

Ajout de dépendances Maven:

Parent 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> 

base 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

En votre modèle: Pouvez-vous remplacer '@ Inject' par' @ OSGiService'? Dans la documentation officielle, '@ Inject' était utilisé pour un modèle adapté de' SlingHttpServletRequest'. Vous vous adaptez depuis 'Resource'. Cela pourrait faire la différence, même si je ne suis pas sûr à 100%. – Jens

Répondre

1

Au service impl que vous avez mis service=WeatherServiceImpl.class ce qui est incorrect, il doit être nom de l'interface de service.

donc, à WeatherServiceImpl changer

@Component(service=WeatherServiceImpl.class, 

à

@Component(service=WeatherService.class, 

..

EDIT: aussi configurationPolicy=ConfigurationPolicy.REQUIRE signifie qu'il devrait y avoir au moins une config pour que le DS composant à être actif. (config à partir du code ne fonctionnera pas)

de sorte que vous pouvez aller dans le système /system/console/configMgr/com.aem.sites.services.impl.WeatherServiceImpl et mettre une valeur et enregistrer. ou vous pouvez définir configurationPolicy à facultatif et votre code fonctionnera sans config.

+1

Merci pour la réponse. Déjà fait mais rien n'a changé. – user972418

+0

J'ai modifié la publication pour inclure les modifications apportées aux deux fichiers pom. Jetez un coup d'oeil s'il vous plait. Merci. – user972418

+0

c'est étrange. J'ai essayé sur 6.3 et a pu obtenir la sortie de message dans la vue. J'ai fait les changements suivants cependant - 1. changez les noms de paquet pour correspondre à mon installation de bac à sable. 2. log4j logger remplacé avec slf4j logger – awd

0

Afin de rendre la section que vous devez configurer correctement modèles de harnais disponibles <Sling-Model-Packages> du maven-bundle-plugin, voir https://sling.apache.org/documentation/bundles/models.html#basic-usage

Vous pouvez vérifier les modèles sont correctement exposés en utilisant la fronde modèles Console Web: http://localhost:4502/system/console/status-slingmodels

+0

Merci pour la réponse. Pensez-vous que la section n'est pas correctement configurée? Dans le même package, c'est-à-dire , j'ai d'autres classes de modèles de sling qui semblent fonctionner correctement. Mais c'est une classe qui ne fonctionne pas comme prévu. J'ai également essayé d'utiliser WCMUsePojo mais même cela n'a pas fonctionné. Donc, je ne sais pas si le fichier pom.xml a des problèmes ou est-ce autre chose. – user972418

+0

La dernière mise à jour du fragment 'pom.xml' semble correcte. J'ai vérifié et ça marche bien sur AEM 6.3. Je suppose que vous n'incluez pas correctement le script HTL, essayez de définir un script HTL minimal avec l'extrait ci-dessus '/ apps/test/banner/banner.html' et un noeud'/content/test' avec 'sling: resourceType = test/banner' et voyez qu'il est rendu correctement dans '/ content/test.html' – Vlad

+0

Êtes-vous capable de construire le projet correctement? Je demande c'est parce que j'ai observé quelques problèmes avec la construction de maven. https://stackoverflow.com/questions/46659511/aem-6-3-maven-build-is-successful-but-still-doesnt-install-all-the-content – user972418