Skip to main content
Level 5
Apr 1, 2019 5:41 PM UTC
Solved

AEM6.4 @Reference not working in SlingServlet

Hi  All,

My sling servlet is not working as soon as i add

@Reference in it, otherwise it works fine

Below is the servlet code, i have create custom configuration as per the AEM6.4 standards(one @Interface class, one Interface class, one Impl class with proper annotations(org.osgi.service.component.annotations))

@Component(service = Servlet.class,

property = { Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",

"sling.servlet.methods=" + HttpConstants.METHOD_GET,

"sling.servlet.paths=" + "/bin/testservlet" }

)

public class TestServlet extends SlingAllMethodsServlet {

  private static final long serialVersionUID = 1L;

 

  @Reference

  MySimpleService mySimpleService;

 

  private static final Logger logger =

  LoggerFactory.getLogger(TestServlet.class);

 

  @Override

  protected void doGet(final SlingHttpServletRequest req, final

  SlingHttpServletResponse resp) throws ServletException, IOException {

  logger.info("Inside doGet!!!");

  try {

  logger.info("Name ::: "+mySimpleService.getMyName());

  resp.getWriter().write(mySimpleService.getMyName()); }

  catch(Exception ex) {

  logger.error("Error in  doGet ::: ", ex);

  }

  }

}

 

Please advise, any help is highly appreciated.

Thanks,

Pradeep

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
smacdonald2008
smacdonald2008Accepted solution
Level 10
Apr 2, 2019 6:00 PM UTC

Look at our SOLR Article. This one closely matches your requirement. We have a class named MySimpleService that reads OSGi config values.

In the Servlet in this article - we use a @Refence to get config values:

@Reference

    SolrServerConfiguration solrConfigurationService;

This shows the proper way of getting OSGI configuration information within an AEM Servlet. Never try and read OSGI config information directly from a servlet. Write a separate class - as shown in this development article.

Adobe Experience Manager Help | Integrating SOLR with Adobe Experience Manager 6.4

Hope this clear this issue up. Notice the Java code in this Servlet. We use the CONFIG values to perform SOLR actions - such as getting the URL to the SOLR server.

            final String protocol = solrConfigurationService.getSolrProtocol();

        final String serverName = solrConfigurationService.getSolrServerName();

        final String serverPort = solrConfigurationService.getSolrServerPort();

        final String coreName = solrConfigurationService.getSolrCoreName();

        final String pagesResourcePath = solrConfigurationService

I would go through this entire article so you understand.

Hope this helps you.

25 replies

smacdonald2008
Level 10
Apr 1, 2019 6:36 PM UTC

Do you mean when you have this line of code:

@Reference

  MySimpleService mySimpleService;

Its not working?

Translate
arunpatidar
Community Advisor
Community Advisor
Apr 1, 2019 6:49 PM UTC

Hi,

Could you please check if your bundle is active or not? If yes the check if you using osgi reference annotation. e.g.

import org.osgi.service.component.annotations.Reference;

e.g.

aem63app-repo/GetFeaturesServlet.java at master · arunpatidar02/aem63app-repo · GitHub

Translate
Arun Patidar
Level 5
Apr 2, 2019 3:46 AM UTC

Yes, If I add @Reference sling servlet stopped working. It is in unsatisfied state due to the reference.

Translate
Level 5
Apr 2, 2019 3:48 AM UTC

Yes, My bundle is in active state, and servlet is unsatisfied state due to @Reference

Translate
Hemant_arora
Level 8
Apr 2, 2019 5:23 AM UTC

In your service class MySimpleService  check the @component annotation:

@Component(service = MySimpleService.class, immediate = true)

Go to http://localhost:4502/system/console/components and search for MySimpleService . Check the status of the service.

Translate
Level 5
Apr 2, 2019 6:51 AM UTC

Hi Donald,

Below is my entire code

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

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

@ObjectClassDefinition(name = "My Service Configuration", description = "Service Configuration")

public @interface CustomConfigIntf {

@AttributeDefinition(name = "Test Namel", defaultValue="Pradeep", description = "Read my name")

    String name();

}

public interface MySimpleService {

public String getName();

}

import org.osgi.service.component.annotations.Activate;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.component.annotations.ConfigurationPolicy;

import org.osgi.service.metatype.annotations.Designate;

@Component(service=MySimpleService.class, configurationPolicy=ConfigurationPolicy.REQUIRE)

@Designate(ocd = CustomConfigIntf.class)

public class MySimpleServiceImpl implements MySimpleService {

private CustomConfigIntf config;

   

    private String name;

    @Activate

    public void activate(CustomConfigIntf config) {

        this.config = config;

        this.name = config.name();

    }

    public String getName() {

        return this.name;

    }

    

}

Let me know where i am doing wrong?

@Referencce is not working in servlet.

Thanks,

Pradeep

Translate
Hemant_arora
Level 8
Apr 2, 2019 7:42 AM UTC

This should work.

____________________________________________________________________________________________________

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

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

@ObjectClassDefinition(name = "My Service Configuration", description = "Service Configuration")

public @interface CustomConfigIntf {

@AttributeDefinition(name = "Test Namel", defaultValue="Pradeep", description = "Read my name")

    String name();

}

______________________________________________________________________________________________________

public interface MySimpleService {

public String getName();

}

______________________________________________________________________________________________________

import org.osgi.service.component.annotations.Activate;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.metatype.annotations.Designate;

import com.aem.test.core.CustomConfigIntf;

import com.aem.test.core.service.MySimpleService;

@Component(service=MySimpleService.class, configurationPolicy=ConfigurationPolicy.REQUIRE)

@Designate(ocd = CustomConfigIntf.class)

public class MySimpleServiceImpl implements MySimpleService {

private CustomConfigIntf configs;

@Activate

public void activate(CustomConfigIntf config) {

this.configs = config;

}

public String getName() {

return configs.name();

}

}

Translate
smacdonald2008
Level 10
Apr 2, 2019 2:16 PM UTC

See this article - where we used @Reference in a SLing Servlet:

Adobe Experience Manager Help | Querying Adobe Experience Manager 6.4 JCR data using the QueryBuilder API

Translate
Level 5
Apr 2, 2019 3:41 PM UTC

Hi Donald,

My requirement is to read custom configuration properties from osgi console in sling servlet using AEM6.4 SP2.

The example you shared is just to define and use the class in @Reference. I didn't find any custom configuration.

Thanks,

Pradeep

Translate
Level 5
Apr 2, 2019 3:48 PM UTC

Hi Hemant arora tried your way also, didn't work.

Translate