很高兴分享这个!我已经工作了〜一个星期来解决这个问题,终于有了最好的答案。
第一:尝试使用 Jersey
kallada 建议的 osgi-jax-rs-connector 是最好的,但我无法让它在 Sling 8 上运行。我花了一整天的时间尝试,我所要展示的只是幽灵类未找到错误和依赖问题。
解决方案:ResourceProvider
Bertrand 的链接仅适用于尚未发布的 Sling 9。下面是您在 Sling 8 及更早版本中的操作方法!
两个文件:
资源提供者
这样做的目的只是监听 /service 上的所有请求,然后在该虚拟路径上生成一个“资源”,而 JCR 中实际上并不存在该资源。
@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 TypeServlet.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;
}
}
Servlet
现在您只需编写一个 servlet 来处理来自该路径的任何资源 - 但这是通过处理具有由在该路径上侦听的 ResourceProvider 生成的资源类型的任何资源来完成的。
@SlingServlet(
resourceTypes = TypeServlet.RESOURCE_TYPE,
methods = {"GET" , "POST"})
public class TypeServlet extends SlingAllMethodsServlet {
static final String RESOURCE_TYPE = "mycompany/components/service/myservice";
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
final String [] pathParts = request.getResource().getPath().split("/");
final String id = pathParts[pathParts.length-1];
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
out.print("<html><body>Hello, received this id: " + id + "</body></html>");
} finally {
out.close();
}
}
}
显然,您的 servlet 会做一些更聪明的事情,例如更智能地处理“路径”字符串并可能生成 JSON。