除了扩展SlingPostServlet,还有更好的选择吗?

时间:2019-04-22 14:30:28

标签: java sling

在Sling应用程序中,我想确保使用特定sling:resourceType创建的节点始终具有使用特定属性创建的子节点。哪种方法符合最佳做法?

  1. 扩展SlingPostServlet类并添加功能以在doPost()方法内添加子节点。这似乎很合适,因为乍一看,可以将servlet链接到特定的资源类型,然后调用super.doPost()以使用默认的SlingPostServlet处理。但是,在安装捆绑软件时,org.apache.sling.servlets.post.impl无法解析(a similar problem was encountered by another user),这将使捆绑软件完全无法运行。

  2. 创建一个SlingPostProcessor并在process()方法中添加功能。由于它不与一种特定的资源类型相关联,因此似乎不太理想。

  3. 使用Sling Eventing

我想避免扩展SlingAllMethodsServlet,因为这对维护对SlingPostServlet中所有默认功能的访问很有用。但是,甚至可以扩展SlingPostServlet而不是SlingAllMethodsServlet吗?

1 个答案:

答案 0 :(得分:2)

我认为没有简单的解决方案可以将该行为绑定到单个资源类型。您将需要检查新资源并根据需要应用更改。 我认为最好的两个选择是您提到的SlingPostProcessor和Resource observation

通过资源观察,您可以“监听”资源的变化并执行您认为合适的任何操作。

实现也相当简单。创建一个新的OSGi服务,该服务实现ResourceChangeListener接口,并添加一些属性以过滤您感兴趣的更改。这类似于使用JCR事件和作业,但更为直接。

这样做的好处是,它独立于任何发布请求。缺点是您需要使用新会话来执行更改。 (您可以使用ResourceResolverFactory.getServiceResourceResolver

例如。

@Component(property = {
    ResourceChangeListener.CHANGES + "=ADDED",
    ResourceChangeListener.PATHS + "=glob:/content/*",
})
public class ResourceObserver implements ResourceChangeListener {

  @Override
  public void onChange(@Nonnull List<ResourceChange> changes) {
      //go through the list of changes and do what you need to do.
  }
}