ResourceResolver getResource returns null inside servlet | Community
Skip to main content
mpalme1
Level 3
October 15, 2020
Solved

ResourceResolver getResource returns null inside servlet

  • October 15, 2020
  • 3 replies
  • 5238 views

On AEM 6.5.3, I'm trying to create a content fragment programmatically inside a servlet using a content fragment model. This is my code. The content fragment model and parent folder do exist in the JCR at the paths I am specifying in modelPath and targetFolderPath, but resourceResolver.getResource is returning null for both. What am I doing wrong?

 

package com.ab.mysite.core.servlets; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import javax.servlet.Servlet; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; import org.osgi.framework.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.adobe.cq.dam.cfm.ContentFragment; import com.adobe.cq.dam.cfm.ContentFragmentManager; import com.adobe.cq.dam.cfm.FragmentTemplate; import org.apache.sling.api.servlets.ServletResolverConstants; @Component( service=Servlet.class, property= { Constants.SERVICE_DESCRIPTION+"=Bio Sync Servlet", "sling.servlet.paths="+"/bin/biosync", ServletResolverConstants.SLING_SERVLET_METHODS + "=POST" } ) public class BioSyncServlet extends SlingAllMethodsServlet { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(BioSyncServlet.class); @Reference private ContentFragmentManager fragmentManager; @SuppressWarnings("deprecation") @Override protected void doPost( SlingHttpServletRequest request, SlingHttpServletResponse response) { try { ResourceResolver resourceResolver = request.getResourceResolver(); String modelPath = "/conf/mysite/settings/dam/cfm/models/test-model"; String targetFolderPath = "/content/dam/mysite/us/en/content-fragments/test"; Resource contentFragmentModel = resourceResolver.getResource(modelPath); Resource parentFolder = resourceResolver.getResource(targetFolderPath); ContentFragment fragment = null; // depreciated way to create fragment = fragmentManager.create(parentFolder, contentFragmentModel, "test", "test"); // recommended way fragment = contentFragmentModel.adaptTo(FragmentTemplate.class).createFragment(parentFolder, "test", "test"); } catch (Exception ex) { log.error(ex.getMessage()); } } }

 

 

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 santhosh_kumark

Hi @mpalme1 ,

 

Try to get the resource resolver from servlet request object as,

                ResourceResolver resourceResolver = null;
                resourceResolver = request.getResourceResolver();   or

Create system user and use the subservice to get the ResourceResolver from ResourceResolverFactory.

              Map<String, Object> param = new HashMap<String, Object>();
              param.put(ResourceResolverFactory.SUBSERVICE, "<systemUser>");
              ResourceResolver resolver = null;
              resolver = resolverFactory.getServiceResourceResolver(param);

 

Regards,

Santosh

3 replies

Manjunath_K
Level 7
October 16, 2020

Hi @mpalme1 

Whenever we need to write/create content on JCR, we should create service user with required permission & using ResourceResolverFactory we need to get the service resource resolver by passing service user details. request.getResourceResolver() will be anonymous on publisher instance whenever it gets request from user & will not be having write permission to write/create content on JCR.

 

 

@Reference
private ResourceResolverFactory resourceResolverFactory;

private static final Map<String, Object> AUTH_DETAILS = ImmutableMap
.of(ResourceResolverFactory.SUBSERVICE, (Object) "writeServiceTest"); //create new service user with proper name & required permission

try
(ResourceResolver resourceResolver = resourceResolverFactory.getServiceResourceResolver(AUTH_DETAILS)){
//code to create content using service resource resolver
}catch (LoginException e) {
LOGGER.error("LoginException occurred", e);
}

 

 

 

Umesh_Thakur
Community Advisor
Community Advisor
October 16, 2020

It seems to be an User and permission issue, please check the service user and its permission.

santhosh_kumark
santhosh_kumarkAccepted solution
Level 6
October 16, 2020

Hi @mpalme1 ,

 

Try to get the resource resolver from servlet request object as,

                ResourceResolver resourceResolver = null;
                resourceResolver = request.getResourceResolver();   or

Create system user and use the subservice to get the ResourceResolver from ResourceResolverFactory.

              Map<String, Object> param = new HashMap<String, Object>();
              param.put(ResourceResolverFactory.SUBSERVICE, "<systemUser>");
              ResourceResolver resolver = null;
              resolver = resolverFactory.getServiceResourceResolver(param);

 

Regards,

Santosh