使用Sling Servlet的多个选择器

时间:2018-04-11 20:46:30

标签: annotations apache-felix sling

简短版本:如何使用Felix注释为多个选择器强制在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使用当前注释来处理更一般的选择器列表?我错过了一些部分注释吗?我相信这个系统可能正在使用较旧的注释。也许值得迁移?我试图不要过于干扰我被要求做的这项小任务。

如果我把这些技术的一部分混为一谈,请耐心等待。我刚刚解决了这个问题,我还在整理它。请更正任何错误的条款。

1 个答案:

答案 0 :(得分:1)

MySpecialServlet之前注册v1.special,例如selectors = {"v1.special"}

根据documentation

  

...必须配置选择器,因为它们将在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