替换单个请求中的节点和子节点



我有一个小部件,它创建一个POST请求,该请求创建一个节点和动态数量的子节点,如:

./sling:resourceType:app/component
_charset_:utf-8
:status:browser
./data:data
./a/a:one
./a/b:two
./b/a:one
./b/b:two

这第一次工作得很好。我得到一个节点以及子节点a和b。问题出在后续请求中。我需要在创建新节点之前删除所有子节点。因此,如果之前我创建了子节点a、b、c和d,那么之前的请求将只保留子节点a和b。

我知道后缀@Delete,但是我需要提前知道哪些子节点需要被删除,而我不知道。

使用Sling Post Servlet可以实现OOTB吗?

问候。

如果您正在使用CQ 5.6或5.6.1,您可以使用':applyTo' request参数通过在其值中传递尾随星号来使用单个请求删除多个项目。

例如,要删除'/content/foo'的所有子节点,则POST请求':operation' = 'delete', ':applyTo' = '/content/foo/*'。

$ curl -F":operation=delete" -F":applyTo=/content/foo/*" http://host/content/sample

这是在Sling 2.1.2中引入的,因此在CQ 5.5及以下版本中不可用,因为5.5运行在2.1.1上。

对于5.5,我怀疑您可能需要获得子节点列表,然后在添加新节点之前将绝对URL传递给:applyTo作为删除它们的值。

我使用的解决方案是使用@Delete后缀。它的问题是,您需要为想要删除的每个节点添加一个带有@Delete后缀的参数。我所做的是提前查询节点,以检查我正在更新的节点的所有子节点,并为每个子节点添加@Delete参数。

那么,如果JCR原来有

-node
 node1
 node2
 node3

我将首先获得http://example.com/content/node.json并遍历json。最后,我将使用

发送请求
./sling:resourceType:app/component
./value:value
./node1@Delete
./node2@Delete
./node3@Delete
./node1/value:value1
./node2/value:value2

将更新node1和node2,同时删除node3。