How to initialize ResourceResolver reference variable. | Community
Skip to main content
This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by sunil_kumar_

Hi @akshaybhujbale ,
Before you get ResourceResolver using service/system user. You must have
1. Must have service user created with needed permissions.
2. It should map with your bundle. if you use for specific project/operations.
You should not do any of these task manually. These should be done by code/configurations.
Created service user and adding permission can done by ACS Commons or Repository Initialization (repoinit). Recommended to use Repository Initialization (repoinit) for aem as a cloud service

 

Using ACS Commons- Create this OSGi config
com.adobe.acs.commons.users.impl.EnsureServiceUser
Or Using Repository Initialization
org.apache.sling.jcr.repoinit.RepositoryInitializer
Map service user to bundle using this OSGi config
org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl

Once you are done with these configs. Get ResourceResolver using this service user

@Reference
ResourceResolverFactory resourceResolverFactory;

final Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put( ResourceResolverFactory.SUBSERVICE, "SERVICE_USER" );
ResourceResolver resolver = resourceResolverFactory.getServiceResourceResolver(paramMap);

Hope this will help



4 replies

DEBAL_DAS
New Member
June 9, 2022

Are you looking for something like below one -

/**
 * 
 */
package com.aem.demo.core.services.impl;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aem.demo.core.services.JcrUtility;

/**
 * @author debal
 *
 */
@Component(service = JcrUtility.class, immediate = true)
public class JcrUtilityImpl implements JcrUtility {

	private final Logger logger = LoggerFactory.getLogger(JcrUtilityImpl.class);

	@Reference
	ResourceResolverFactory resourceResolverFactory;

	@Override
	public ResourceResolver getResourceResolver() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put(resourceResolverFactory.SUBSERVICE, "readWriteService");
		ResourceResolver serviceResourceResolver = null;
		try {

			serviceResourceResolver = resourceResolverFactory.getServiceResourceResolver(map);
		} catch (LoginException e) {
			logger.error("Could not get service user [ {} ]", "demoSystemUser", e.getMessage());
		}
		return serviceResourceResolver;

	}

	@Override
	public void closeResourceResolver(ResourceResolver resourceResolver) {
		if (Objects.nonNull(resourceResolver)) {
			resourceResolver.close();
		}

	}

}
Debal Das, Senior AEM Consultant
Level 6
June 9, 2022

Hi @debal_das 

 

I have tried this code but getting nullpointer error at this line 

rerviceResourceResolver = resourceResolverFactory.getServiceResourceResolver(map)

basically it is not initilizing resourceResolverFactory using @Refernece annotation.

DEBAL_DAS
New Member
June 9, 2022

I believe you have added bundle symbolic name, subServiceName and system user mapping like the below one -

 

You have created system user and given requisite permission also -

 

Debal Das, Senior AEM Consultant
Anmol_Bhardwaj
Community Advisor
Community Advisor
June 9, 2022

Can you briefly explain your use-case. Like why do you need the resourceResolver outside model or without the @3214626 annotation.

This is usually not a good practive and created overhead.

 

Expanation:

https://stackoverflow.com/questions/41708758/aem-sling-how-to-create-resourceresolverfactory-in-a-standalone-code

 

If you can explain your use case, maybe it can be done without resource resolver.

sunil_kumar_
sunil_kumar_Accepted solution
Level 5
June 9, 2022

Hi @akshaybhujbale ,
Before you get ResourceResolver using service/system user. You must have
1. Must have service user created with needed permissions.
2. It should map with your bundle. if you use for specific project/operations.
You should not do any of these task manually. These should be done by code/configurations.
Created service user and adding permission can done by ACS Commons or Repository Initialization (repoinit). Recommended to use Repository Initialization (repoinit) for aem as a cloud service

 

Using ACS Commons- Create this OSGi config
com.adobe.acs.commons.users.impl.EnsureServiceUser
Or Using Repository Initialization
org.apache.sling.jcr.repoinit.RepositoryInitializer
Map service user to bundle using this OSGi config
org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl

Once you are done with these configs. Get ResourceResolver using this service user

@Reference
ResourceResolverFactory resourceResolverFactory;

final Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put( ResourceResolverFactory.SUBSERVICE, "SERVICE_USER" );
ResourceResolver resolver = resourceResolverFactory.getServiceResourceResolver(paramMap);

Hope this will help



BrianKasingli
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
June 10, 2022

@akshaybhujbale,

The best practice is to utilize the system user. If you like videos, take a look at this one. It's an easy to follow youtube video from AEM Geeks, https://www.youtube.com/watch?v=H_ljzX9B4Q

 

sunil_kumar_
Level 5
June 10, 2022

@briankasingli , 
I guess, you missed something in url. Let me add correct url.

https://youtu.be/H_ljzX9B4Q0