Aha! Solved!!!! Here's my solution for posterity.

While Jersey would have been a preferred, more feature-rich solution, I just
couldn't get the OSGI-Jersey stuff working.

The solution: 

- ResourceProvider listens for all requests to a particular path, and
returns a false "Resource" object, which doesn't actually exist in the JCR,
but it does have a resourceType

- A Servlet registers to render that resourceType.

Between these two, you've essentially got a Servlet that listens to a all
requests that fall under a particular Path :)

Registering a Servlet for a resourceType is pretty elementary, but for
posterity looking to get this ResourceProvider working in Sling 8, here's
how I did it. I expect there are better ways, but this is demonstrative:


/**
 * Created by lancedolan on 1/27/17.
 */
@Component
@Service(value=ResourceProvider.class)
@Properties({
        @Property(name = ResourceProvider.ROOTS, value = "service/image"),
        @Property(name = ResourceProvider.OWNS_ROOTS, value = "true")
})
public class ImageResourceProvider implements ResourceProvider  {

//    @Override
    public Resource getResource(ResourceResolver resourceResolver, String
path) {

        AbstractResource abstractResource;
        abstractResource = new AbstractResource() {
            @Override
            public String getResourceType() {
                return ImageTypeServlet.RESOURCE_TYPE;
            }

            @Override
            public String getResourceSuperType() {
                return null;
            }

            @Override
            public String getPath() {
                return path;
            }

            @Override
            public ResourceResolver getResourceResolver() {
                return resourceResolver;
            }

            @Override
            public ResourceMetadata getResourceMetadata() {
                return new ResourceMetadata();
            }
        };

        return abstractResource;
    }

//    @Override
    public Resource getResource(ResourceResolver resourceResolver,
HttpServletRequest httpServletRequest, String path) {
        return getResource(resourceResolver , path);
    }

//    @Override
    public Iterator<Resource> listChildren(Resource resource) {
        return null;
    }
}

And then you just create your own servlet, analogous to my ImageTypeServlet
which contains a static final String RESOURCE_TYPE



--
View this message in context: 
http://apache-sling.73963.n3.nabble.com/How-to-create-Rest-APIs-for-non-JCR-data-in-Sling-8-tp4069947p4070023.html
Sent from the Sling - Users mailing list archive at Nabble.com.

Reply via email to