Can’t you just create sling servlet registered to some resource type? 
You can then simply create JCR node(s) mapped to your resource type. 
You can also use a SynthaticResource via custom resource provider, which is the 
track you’re on and what Steven is suggesting. 
But I find that in most cases just creating a JCR node is more convenient and 
you can apply JCR ACLs to it control access if you need it. 

> On Jan 27, 2017, at 9:34 PM, Steven Walters <kemu...@gmail.com> wrote:
> 
> On Sat, Jan 28, 2017 at 6:27 AM, lancedolan <lance.do...@gmail.com> wrote:
>> Hi friends,
>> 
>> I've tried routing questions through stackoverflow to cut down my mails to
>> this list. I'm losing lots of time on this one, though, and am stuck.
>> 
>> I need to create APIs which don't represent Sling Resources. Example:
>> /services/images/123123123
>> that image will exist somewhere else.
>> 
>> Bertrand suggests creating a ResourceProvider, as in the example here [1].
>> However, that uses the spi package which is not in version 2.9.0 of
>> org.apache.sling.api, and thus, not available to me in Sling 8.
>> 
>> I did find a ResourceProvider interface to implement though, and created
>> this code:
>> 
>> /**
>> * Created by lancedolan on 1/27/17.
>> */
>> @Component
>> @Service(value=ResourceProvider.class)
>> @Properties({
>>        @Property(name = ResourceProvider.ROOTS, value = "things"),
>>        @Property(name = ResourceProvider.OWNS_ROOTS, value = "true")
>> })
>> public class ImageResourceProvider implements ResourceProvider {
>> 
>>    /** If this provider required a context this would be more elaborate,
>>     *  but for this simple example we don't need one.
>>     */
>>    public static class DoesNotNeedAContext {
>>    };
>> 
>>    @Override
>>    public Resource getResource(ResourceResolver resourceResolver, String
>> path) {
>>        Resource returnResource = new SyntheticResource(resourceResolver,
>> path, "edlio/microservice/image");
>>        returnResource.getValueMap().put("myProp" , "myValue");
>>        return returnResource;
>>    }
>> 
>>    @Override
>>    public Resource getResource(ResourceResolver resourceResolver,
>> HttpServletRequest httpServletRequest, String path) {
>>        return getResource(resourceResolver , path);
>>    }
>> 
>>    @Override
>>    public Iterator<Resource> listChildren(Resource resource) {
>>        return null;
>>    }
>> }
>> 
>> 
>> The result is that I get a 403 response. How do I control the authentication
>> for resources that don't actually exist? The fact that I'm not getting 404
>> means that my ResourceProvider is at least registering successfully.
>> 
>> Finally, I'd much prefer to use Jersey if possible... Anybody have success
>> getting Jersey to work in Sling 8? I dumped a bunch of time into it and gave
>> up after class not found errors for classes that should be found [2].
>> 
>> The ultimate goal is just to provide a restful API in Sling 8 and the
>> static-path-declaration of SlingSafeMethodsServlet just doesn't cut it.
>> 
>> Thanks a million guys...
> 
> The Sling paradigm for this is to create resources through the
> resource provider,
> and then create/register a servlet to respond to the resource type
> you're creating (not a static path).
> 
> So from your above code, you'd create an additional servlet registered
> to the resourceType "edlio/microservice/image" (instead of registered
> to a static path) and implement GET inside it.
> 
> Without the corresponding servlet, this is most likely being served by
> the default GET servlet, which will not particularly understand how to
> deal with these resources, thus the errors.

Reply via email to