Access OSGI ser­vice from Sightly WCMUsePojo | AEM 6.3 | Community
Skip to main content
neerajg29767140
Level 2
September 28, 2017

Access OSGI ser­vice from Sightly WCMUsePojo | AEM 6.3

  • September 28, 2017
  • 5 replies
  • 14507 views

Create AEM 6.3 component making use of WCMUsePojo accessing OSGI Service.


Step 1: Create an interface name OSGITestInterface.java that will be implemented by service impl.


public interface OSGITestInterface {

String getOSGIName();

String getOSGIDesc();

String getOSGIuse();

String getOSGIData();

}


Step 2: Create a Interface Implementation class name OSGITestInterfaceImpl.java


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.apache.felix.scr.annotations.Component;

import org.apache.felix.scr.annotations.Service;


@Component

@Service

public class OSGITestInterfaceImpl implements OSGITestInterface {


Logger logger = LoggerFactory.getLogger(OSGITestInterfaceImpl.class);


@Override

public String getOSGIName() {

  return "Test Service";

}


@Override

public String getOSGIDesc() {

  return "AEM OSGI Service";

}


@Override

public String getOSGIuse() {

  return "OSGI Service data";

}

        @Override

public String getOSGIData() { 

  String name = this.getOSGIName();

  String desc = this.getOSGIDesc();

  String use = this.getOSGIuse();

  return name + desc + use;

}


}


Step 3: Create Test Component and use below sightly code in component html.


Fetch values from OSGI Service using WCMSUepojo.

    <sly data-sly-use.info="com.test.utils.TestPojoComp"></sly>

    ${info.details}

</div>


Step 4: Write helper class extending WCmUsePojo.


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


import com.adobe.cq.sightly.WCMUsePojo;


public class TestPojoComp extends WCMUsePojo {

Logger logger = LoggerFactory.getLogger(TestPojoComp.class);

protected String detail;


@Override

  public void activate() {  


OSGITestInterface service = getSlingScriptHelper().getService(OSGITestInterface.class);

    detail = service.getOSGIData();

  }


  public String getDetails() {

    return this.detail;

  }

}


Step 5: Create webpage using any of existing template. Drag and drop newly created component into the page.


Validate output.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

5 replies

Ratna_Kumar
Level 10
September 29, 2017

Good Community work!!

~Ratna

smacdonald2008
Level 10
September 29, 2017

Nice summary - we show this pattern here - where the service we hook into from WCMUsePojo queries the JCR -- Scott's Digital Community: Creating an AEM HTL component that queries the JCR

Feike_Visser1
Adobe Employee
Adobe Employee
September 29, 2017

You can also use the OSGi-service directly in HTL, so in this case no need for a wrapper-class.

AdobeID24
Level 5
September 19, 2018

How we can use services directly in Sightly?

Prabhat_Jain
Level 2
September 25, 2018

First scenario worked when I called my WCM use class in my sightly like below :

<p data-sly-use.search="amitsample.core.filters.Develope">

   ${search.details}

</p>

but this second scenario dint work when i tried calling my service directly in my sightly:

<p data-sly-use.servObj="amitsample.core.filters.HelloService">

   ${servObj.repositoryName}

</p>

For this i got error like:

Error during include of component '/apps/amitsample/components/content/servicecompo'

Error Message:

org.apache.sling.scripting.sightly.SightlyException: Identifier amitsample.core.filters.HelloService cannot be correctly instantiated by the Use API

Processing Info:

Page=/content/srevice
Resource Path=/content/srevice/jcr:content/par12/servicecompo
Cell=servicecompo
Cell Search Path=pagerendring|page/par12|parsys/servicecompo
Component Path=/apps/amitsample/components/content/servicecompo

Any Idea?

My other code :

Develope.java

================

And these are my code:

package amitsample.core.filters;

import com.adobe.cq.sightly.WCMUse;

import amitsample.core.filters.HelloService;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Develope extends WCMUse {

Logger logger = LoggerFactory.getLogger(Develope.class);

protected String details;

@Override

  public void activate() throws Exception {

  HelloService serv= getSlingScriptHelper().getService(HelloService.class);

details=serv.getRepositoryName();

logger.info("this is the first log values");

 

  }

   public String getDetails() {

  

    return details;

  }

}

HelloService.java

=============

package amitsample.core.filters;

/**

* A simple service interface

*/

public interface HelloService {

  

    /**

     * @return the name of the underlying JCR repository implementation

     */

    public String getRepositoryName();

}

HelloServiceImpl.java

===================

package amitsample.core.filters;

import javax.jcr.Repository;

import org.apache.felix.scr.annotations.Component;

import org.apache.felix.scr.annotations.Reference;

import org.apache.felix.scr.annotations.Service;

import org.apache.sling.jcr.api.SlingRepository;

@Service

@Component(metatype = false)

public class HelloServiceImpl implements HelloService {

  

    @Reference

    private SlingRepository repository;

    public String getRepositoryName() {

        return repository.getDescriptor(Repository.REP_NAME_DESC);

    }

}


Hi AdobeID24​,

I also faced similar issue.As mentioned do not use capital case in package name as It will not get instantiate

import amitsample.core.filters.HelloService;

You can use :amitsample.core.filters.helloService

Prabhat_Jain
Level 2
September 10, 2018

Anyone knows why @Reference annotation won't work ?

Feike_Visser1
Adobe Employee
Adobe Employee
September 10, 2018

this only works in OSGi components, WCMUsePojo is not an OSGi-component

Prabhat_Jain
Level 2
September 10, 2018

Thanks 4 the answer

AdobeID24
Level 5
September 19, 2018

wow ..well explained

Jitendra_S_Toma
Level 10
September 19, 2018

You can get service reference using request object as well.

How to get OSGI Service reference in AEM?