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.

Resource resolver returning null...

Avatar

Level 2

Hello all,

 

I have two classes. Class A, is where I am calling a method to Class B (Which contains code that's trying to get the resource resolver).

Code for class B where I am getting the null error:

 

@component

@ServiceMode

public class NotifyAdminImpl implements NotifyAdminService
{

private static final Logger LOGGER = LoggerFactory.getLogger(NotifyAdminImpl.class);

@reference
ResourceResolverFactory resolverFactory;

public void notifyAdmin(String location,String exception)
{
LOGGER.debug("We are inside the notifyAdmin method.");

try
{
LOGGER.debug("Begin.");

String timeStamp = DateTimeFormatter.ofPattern("MM_dd_yyyy_HH_mm_ss").format(LocalDateTime.now());

HashMap<String, Object> authInfo = new HashMap<String, Object>();

authInfo.put("user.name","serviceadmin");
authInfo.put("user.password",new java.lang.String("randomPassword!LOL").toCharArray());

ResourceResolver resourceResolver = resolverFactory.getResourceResolver(authInfo); // line where it nulls out.

Session session = resourceResolver.adaptTo(Session.class);

Resource res = resourceResolver.getResource("/apps/errorHandle/error");

Node node = res.adaptTo(Node.class);

Calendar c = Calendar.getInstance();

c.setTimeInMillis(c.getTimeInMillis());

String nodeName = location + timeStamp;

String path = node.getPath();

LOGGER.debug("PATH OF INCOMING NODE IS: " + path);

Node errorNode = node.addNode(nodeName,"nt:unstructured");

errorNode.setProperty("jcr:created", c);

errorNode.setProperty("exception", exception);

errorNode.setProperty("isEmailSent", false);

session.save();

session.logout();

LOGGER.debug("End.");

}
catch (Exception e)
{
e.printStackTrace();
LOGGER.info("An exception in notifyAdmin method occurred due to: " + e.getMessage(),e);
}

}

}

 

Class A code snippet of calling this method from Class B that's within my OSGi bundle:

NotifyAdminImpl notify = new NotifyAdminImpl();

notify.notifyAdmin("this_is_an_error",printExceptionString);

 

 

 

 

6 Replies

Avatar

Community Advisor

Hi @christopherv662 ,

 

You can get resource resolver through sub service. All you have to do is -

 

1. Create a System user and give proper permission.

2. Configure "Apache Sling Service User Mapper Service" for System user and Service mapping.

3. Use below code to get the Resource resolver-

 

public ResourceResolver getResourceResolver() {
ResourceResolver resourceResolver = null;
try {
Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, "writeService");
resourceResolver = resolverFactory.getServiceResourceResolver(param);
} catch (Exception e) {
}
return resourceResolver;
}

 

I have explained the step by step process in below video-

https://www.youtube.com/watch?v=CatRHs0rt4o

Avatar

Level 2
Hi, I tried this and I am still getting the null. I created the service user and mapped it as you did.

Avatar

Community Advisor

Hi @christopherv662,

 

First of all, try to see, why the way suggested by @Ritesh_Mittal is not working for you. Here's another article for your reference - 

https://one-inside.com/aem6-resourceresolver-access-in-services/

 

Secondly, try to use 

ResourceResolver resourceResolver = resourceResolverFactory.getServiceResourceResolver(null) - If the param is null, the resource resolver returned will generally not be authenticated and only provide minimal privileges
 
Thirdly, What is class A? Do you have access to Resource/Request in that class, so you can pass resource resolver as a parameter, while calling class B
 
Thanks,
Chitra

Avatar

Employee Advisor

Hi @christopherv662 

 

Can you try "Apache Sling Service User Mapper Service Amendment" rather than "Apache Sling Service User Mapper Service".

Avatar

Employee Advisor

@christopherv662  If you're using OSGi R6 annotations, error is probably  beacuse  @Reference annotation would not wrok as below. Try changing it to @OSGIService

@reference
ResourceResolverFactory resolverFactory;