【问题标题】:Multiple selectors using Sling Servlets使用 Sling Servlet 的多个选择器
【发布时间】:2018-09-21 21:03:58
【问题描述】:

短版:如何使用 Felix 注释对 sling servlet 使用基于多个选择器的 servlet 强制最匹配?

我在 OSGI 包中定义了一些 servlet。我正在使用 org.apache.felix.scr.annotations.sling.SlingServlet 注释。

@SlingServlet(
   methods={GET},
   selectors {"v1"}
   ...
)
public class MyServlet extends SlingAllMethodsServlet {}

...

@SlingServlet(
   methods={GET},
   selectors {"v1","special"}
   ...
)
public class MySpecialServlet extends MyServlet {}

我的问题是我找不到强制 MySpecialServlet 仅在两个选择器都存在时处理请求的方法。

GET http://localhost/my/resource.v1.special.json

有时它只会处理对 v1 选择器的请求。

GET http://localhost/my/resource.v1.json

似乎在使用通过 felix webconsole 发布新 jar 之后,如果我在任何其他资源之前请求双选择器 resource.v1.special.json,那么 MySpecialServlet 还将继续处理仅 v1 请求。

有没有一种方法可以强制更通用的 servlet 使用当前注释来处理更通用的选择器列表?我错过了一些部分注释吗?我相信这个系统可能使用的是较旧的注释。也许值得迁移?对于我被要求做的这个小任务,我尽量不要太打扰。

如果我将这些技术的某些部分混为一谈,请耐心等待。我刚刚解决了这个问题,我还在整理它。请更正任何不一致的术语。

【问题讨论】:

    标签: annotations apache-felix sling


    【解决方案1】:

    通过v1.special注册您的MySpecialServlet,例如selectors = {"v1.special"}。

    根据documentation:

    ... 选择器必须按照在 URL 中指定的方式进行配置,URL 是点分隔字符串的列表,例如 print.a4 ...

    我了解,当通过选择器列表注册 servlet 时,Sling 会单独处理它们(如在 OR 条件内)。因此,在通过selectors = {"v1","special"} 注册您的特殊servlet 的情况下,如果您请求,将调用doGet 方法:

    • http://localhost/my/resource.v1.special.json 或
    • http://localhost/my/resource.special.json 或
    • http://localhost/my/resource.v1.json

    【讨论】:

    • 我找不到文档中明确表示 sling 将它们视为 OR 条件的部分。这是否意味着 resource.v1.special.json 和 resource.special.v1.json 是不同的?我一直在查看我们的代码,看起来有人在我们得到解决方案之前破坏了过滤器中的选择器,所以我的问题也可能是
    • 我并不是说 DOC 提到了 OR 条件,而是我们可以通过运行一些测试来验证自己。我已经修改了响应以明确这一点。当然,您可以使用过滤器来预处理请求,但严格考虑选择器注册,我认为您拥有“v1.special”(如果您不确定订单,还有“special.v1”)可以解决问题。
    • 是的,OR 是我从测试中得出的结果。在取消过滤器中的选择器和使用“v1.special”之间,我能够让它工作。编写我走过去的代码的人都假设该列表是 AND。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多