gpt4 book ai didi

java - 是否有更好的替代方案来扩展 SlingPostServlet?

转载 作者:行者123 更新时间:2023-11-30 01:51:39 24 4
gpt4 key购买 nike

在 Sling 应用程序中,我想确保使用特定 sling:resourceType 创建的节点总是有一个使用特定属性创建的子节点。什么方法可以实现这一点符合最佳实践?

  1. 扩展SlingPostServlet类并添加功能以在 doPost() 中添加子节点方法。这看起来很合适,因为乍一看,可以将 servlet 链接到特定资源类型,并调用 super.doPost()使用默认的SlingPostServlet加工。但是,在安装 bundle 时,org.apache.sling.servlets.post.impl无法解析 ( a similar problem was encountered by another user ),这会导致 bundle 根本无法运行。

  2. 创建 SlingPostProcessor并在 process() 中添加功能方法。这似乎不太理想,因为它不依赖于一种特定的资源类型。

  3. 使用Sling Eventing .

我想避免扩展 SlingAllMethodsServlet ,因为维护对 SlingPostServlet 中所有默认功能的访问将很有用。 。然而,是否有可能延长 SlingPostServlet ,而不是 SlingAllMethodsServlet

最佳答案

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

资源观察允许您“监听”资源的变化并执行您认为合适的任何操作。

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

这样做的好处是它独立于任何发布请求。缺点是您需要使用新 session 来执行更改。 (您可以使用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.
}
}

关于java - 是否有更好的替代方案来扩展 SlingPostServlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55796025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com