CQ5.5获取servlet中资源的.infinity.json

时间:2014-04-16 15:16:46

标签: cq5 sling

如果我们设置了组件资源:

  • myComponent的
    • mycomponent.jsp
    • mycomponent.JSON.jsp

我们可以假设它可以这样工作:

  • /path/to/mycomponent.html =>见html
  • /path/to/mycomponent.json =>见我的json

同样在servlet中我们可能会做类似

的事情
Resource myResource = resourceResolver.getResource(request, "path/to/mycomponent");

我很好奇我如何能够在servlet上下文中获取.json表示。

我已经做了一些解决这个问题的事情,但我想知道是否有另一种方式,因为这个解决方案有很大的局限性。基本上我在路径上加载Node并执行Node的JSONDumps和它的子节点。这将允许我从mycomponent.getPath()的资源中获取更大的JSON集,但它不允许我拉动我通过mycomponent.JSON.jsp创建的自定义JSON视图。

任何想法/建议都会很棒,谢谢。

3 个答案:

答案 0 :(得分:5)

要捕获呈现资源的输出,您可以使用SlingRequestProcessor服务,该服务在内部发出请求而不通过网络层,但仍使用用于处理HTTP请求的所有相同呈现机制。 / p>

如果您只需要在计算的渲染中包含此类输出,则可以使用Request.getRequestDispatcher(somePathWithJsonExtension).include(request, response),这是Sling和CQ包含的JSP标记。

使用resourceResolver.getResource(...)不进行任何渲染,它只提供一个原始资源,它是一个数据/内容对象。

答案 1 :(得分:3)

问题的标题听起来像是想要想要获得等同于/path/to/mycomponent.-1.json的cURL / AJAX调用,但是在Servlet或其他Java类中。

您可以使用org.apache.sling.commons.json.jcr.JsonItemWriter类将JCR节点转储为具有无限递归的JSONObject。通过将Set传入构造函数,您可以指定要从最终JSON中排除的属性。有关更多示例,请参阅http://www.nateyolles.com/blog/2015/12/converting-aem-sling-resources-to-json

Resource resource = resolver.getResource("/content/my-app/my-page");

if (resource != null) {
    Node node = resource.adaptTo(Node.class);
    StringWriter stringWriter = new StringWriter();
    JsonItemWriter jsonWriter = new JsonItemWriter(null);

    try {
        jsonWriter.dump(node, stringWriter, -1);
        JSONObject jsonObject = new JSONObject(stringWriter.toString());
    } catch (RepositoryException | JSONException e) {
        LOGGER.error("Could not create JSON", e);
    }
}

您也可以像上面讨论的Bertrand一样使用org.apache.sling.engine.SlingRequestProcessor类。有关更多示例,请参阅http://www.nateyolles.com/blog/2015/10/get-rendered-html-for-an-aem-resource-or-component

@Reference
private RequestResponseFactory requestResponseFactory;

@Reference
private SlingRequestProcessor requestProcessor;

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
        throws ServletException, IOException {

    /* Setup request */
    HttpServletRequest req = requestResponseFactory.createRequest("GET",
            "/content/my-app/my-page.-1.json");

    /* Setup response */
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    HttpServletResponse resp = requestResponseFactory.createResponse(out);

    /* Process request through Sling */
    requestProcessor.processRequest(req, resp, request.getResourceResolver());
    String jsonString = out.toString();
}

答案 2 :(得分:0)

请记住,您正在使用JSP页面来呈现您的JSON。如果您使用sling servlet执行此操作,有几种方法是可行的,但这不是尝试直接写出响应的最佳方法,尤其是因为您有一个JSP视图来执行此操作对你而言。

看一下这篇文章:

servlet result display in jsp page

具体做法是:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    Object data = "Some data, can be a String or a Javabean";
    request.setAttribute("data", data);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

如果你只想渲染一些JSON。

否则,另一个不太优雅的选择是向JSON发出同步本地HTTP请求。

希望有所帮助。