Hi @ns334 ,
In AEM, when using a servlet, you can obtain a ResourceResolver in two ways:
- Using ResourceResolverFactory
- Using SlingHttpServletRequest#getResourceResolver()
1. Getting ResourceResolver from ResourceResolverFactory
This is a generic way to obtain a ResourceResolver, independent of the request.
Applicable for both Path-based and ResourceType-based servlets.
@Reference
private ResourceResolverFactory resourceResolverFactory;
public ResourceResolver getResourceResolver() {
Map<String, Object> authInfo = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, "data-reader");
try {
return resourceResolverFactory.getServiceResourceResolver(authInfo);
} catch (LoginException e) {
throw new RuntimeException("Failed to get ResourceResolver", e);
}
}
Use Case: When you need a ResourceResolver for background jobs, services, or when no request object is available.
Permissions: Requires a system user (data-reader in this example) configured in Apache Sling Service User Mapper.
2. Getting ResourceResolver from SlingHttpServletRequest
This method derives the ResourceResolver from the incoming request.
Only applicable within request-based scenarios (Servlets, Models, Filters).
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
ResourceResolver resolver = request.getResourceResolver();
Resource resource = resolver.getResource(request.getRequestPathInfo().getResourcePath());
response.getWriter().write("Resource Path: " + resource.getPath());
}
Use Case: When handling user-specific requests that rely on the session’s authentication.
Permissions: Uses the current logged-in user’s credentials (subject to ACL restrictions).
When to Use Which?
1. System service requiring elevated permissions → Use ResourceResolverFactory (System User).
2. Request-based logic (retrieving user’s session resolver) → Use request.getResourceResolver().
3. API endpoint that doesn’t depend on a resource → Use Path-Based Servlet.
4. Component-specific processing (e.g., fetching data for a dialog) → Use ResourceType-Based Servlet.
Regards,
Amit Vishwakarma