使用 Sling Servlet 的多个选择器

Multiple selectors using Sling Servlets

简短版本:如何使用 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 后,如果我请求双选择器资源。v1.special.json 在任何其他资源之前,MySpecialServlet 也将继续处理仅 v1 请求。

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

如果我将这些技术的某些部分混为一谈,请多多包涵。我刚刚解决了这个问题,但我仍在解决它。请更正任何不一致的术语。

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

根据 documentation

... The selectors must be configured as they would be specified in the URL that is as a list of dot-separated strings such as 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