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.