Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

service injection with parameter

Avatar

Level 2

I am trying to call AWS S3 bucket from our AEM. I have created an S3Manager class/service to to wrap it. which will be injected/referenced from wherever needed. This is working fine, but requires to create AmazonS3Client instance each time when I need to upload or download a file.

I am trying to initialise the amazonS3Client in the constructor instead, so I don't need to create so many instance.

private AmazonS3Client amazonS3Client;

public S3Manager(){

  String externalId = sitemapService.getAssumeRoleId();
   String roleArn = sitemapService.getRoleArn();


   amazonS3Client = getAmazonS3Client(externalId, roleArn);
}

SitemapService is another service I created to read the OSGI config (from xml or the console). The way I am doing seems not working, I am getting following exception, when initialisation try to run  sitemapService.getAssumeRoleId();

Error during instantiation of the implementation object (java.lang.NullPointerException)

I assume at the point of running, sitemapservice has not been injected yet. Is there a way, I can assure that sitemapservice injection is completed before initialise S3Manager? Or there is better way to achieve what I am looking for. Thanks

1 Accepted Solution

Avatar

Correct answer by
Employee Advisor

When you use the standard injection (just @Reference) it has the ReferencePolicy static. That means, that this reference must be satisfied in order to acticate the component.

But I am quite sure, that your issue is different. When you implement that in the constructor, the OSGI runtime has not yet injected the references. You need to implement a service activator, see Apache Felix - Apache Felix Service Component Runtime (SCR)  for a way how to do it (note: today you are encouraged to use OSGI annotations and no longer SCR, but the activate stuff remains the same ...)

Jörg

View solution in original post

3 Replies

Avatar

Correct answer by
Employee Advisor

When you use the standard injection (just @Reference) it has the ReferencePolicy static. That means, that this reference must be satisfied in order to acticate the component.

But I am quite sure, that your issue is different. When you implement that in the constructor, the OSGI runtime has not yet injected the references. You need to implement a service activator, see Apache Felix - Apache Felix Service Component Runtime (SCR)  for a way how to do it (note: today you are encouraged to use OSGI annotations and no longer SCR, but the activate stuff remains the same ...)

Jörg

Avatar

Level 2

Thanks Jörg. How would I able to make sure that the injection happens before the initialisation? I have already tried to set attribute immediate to true for the Component, but that doesn't make any difference.  Is there something I can configure the order or so ? Thanks

Avatar

Employee Advisor

Make sure you understand the OSGI component livecycle. Initialization should not happen in the constructor, but rather in the activate() method (or the method annotated with @Activate).

Besides the OSGI specification (which is sometimes hard to read) I found org.osgi.service.component | osgi.enroute.site  to explain it nicely.

Jörg