【问题标题】:How to ceate node with JSON in AEM through servlet?如何通过 servlet 在 AEM 中使用 JSON 创建节点?
【发布时间】:2020-12-08 02:26:56
【问题描述】:

我创建了一个带有 post 方法的 servlet。然后,我使用邮递员用正文中的 JSON 文件请求它。 现在我想用从 servlet 检索到的 JSON 创建节点。我怎样才能做到这一点? 我知道如何创建节点和 setProperties,但只有字符串。我想用这样的 JSON 文件创建节点和 setProperties

[
  {
    "_id": "5fc9dadaca52c28bb40011ee",
    "index": 0,
    "tags": [
      "laboris",
      "minim",
     ]
   },
   {
    "_id": "5fc9dada30930ef9d77c6d91",
    "index": 1,
    "tags": [
      "duis",
      "est",
     ]
   },
]

请帮帮我!

【问题讨论】:

  • 您希望将整个 json 保存在节点属性或 json 文件中?请发布 servlet 的代码以更好地了解您的要求

标签: java servlets aem aem-6 crx


【解决方案1】:

Sling Post Servlet 正是您所寻找的。具体导入操作:

https://sling.apache.org/documentation/bundles/manipulating-content-the-slingpostservlet-servlets-post.html#importing-content-structures-1

但是,对于对象,您需要将 JSON 结构作为值对。这是一个基于您的示例 json 的示例:

{
    "node": "parent",
    "childs": {
        "child1": {
            "_id": "5fc9dadaca52c28bb40011ee",
            "index": 0,
            "tags": [
                "laboris",
                "minim"
            ]
        },
        "child2": {
            "_id": "5fc9dada30930ef9d77c6d91",
            "index": 1,
            "tags": [
                "duis",
                "est"
            ]
        }
    }
}

从前端

这是一个使用 json 文件调用 sling post servlet 的示例。您可以在 JS 中遵循相同的模式,但指定 :content 而不是 :contentFile

curl http://localhost:4502/content/newTree \
  -u admin:admin \
  -F":operation=import" \
  -F":contentType=json" \
  -F":replace=true" \
  -F":replaceProperties=true" \
   -F":contentFile=@my-json-file.json"

从后端

您也可以从后端创建一个 POST 请求:

@Component(
    service = Servlet.class,
    property = {
        ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET,
        ServletResolverConstants.SLING_SERVLET_PATHS + "=" + "/bin/services/test"
    })
public class Test extends SlingSafeMethodsServlet {

    @Reference
    private SlingRequestProcessor requestProcessor;

    @Reference
    private RequestResponseFactory requestResponseFactory;

    @Override
    protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws IOException {
        final ByteArrayOutputStream output = new ByteArrayOutputStream();
        final Map<String, Object> parameters = ImmutableMap.of(
            ":operation", "import",
            ":contentType", "json",
            ":replaceProperties", "true",
            ":replace", "true",
            ":content", json
        );
        final HttpServletRequest postRequest = requestResponseFactory
            .createRequest(HttpConstants.METHOD_POST, "/content/newTree", parameters);
        final HttpServletResponse postResponse = requestResponseFactory.createResponse(output);

        try {
            requestProcessor.processRequest(postRequest, postResponse, request.getResourceResolver());
        } catch (ServletException e) {
            // handle exception
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多