期待分享這個!我已經工作〜一個星期解決這個問題,終於有最好的答案。
第一:儘量使用澤西
通過kallada提出的OSGi的JAX-RS-連接器是最好的,但我無法得到它吊帶8.工作,我失去了一整天的努力,所有的我必須表現出它是幽靈類沒有發現錯誤和依賴性問題。
解決方案:ResourceProvider
Bertrand的鏈接是吊帶9只,這不會被釋放。所以這裏是你如何在8歲以上的Sling中做到這一點!
兩個文件:
- ResourceProvider
- 的Servlet
的ResourceProvider
這樣做的目的只是爲了在聽取/服務的所有請求,然後產生該虛擬路徑上的「資源」,實際上並不存在於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會做更聰明的事情,比如更智能地處理「path」字符串,可能會產生JSON。
嗨Tomek,謝謝你的迴應。不幸的是,由於我們正在處理遺留的應用程序,因此我們的要求相當堅定,我們正試圖避免重寫。 –
@TomekRękawek我懷疑這是否是您在CQ5中建議作爲REST web服務的替代方案,假設某些外部應用程序工具想要通過REST訪問,並且我們提供了此servlet,並且該工具會嘗試爲此生成WADL RESTWebservice(我們的servlet)然後失敗。那麼您是否知道我們可以像精確寧靜的web服務那樣執行任何方式,以便爲該REST URL生成WADL甚至可以成功完成? – samir