Несколько селекторов с использованием сервлетов Sling

Краткая версия: как заставить сервлет наибольше соответствовать на основе нескольких селекторов, используя аннотации Felix для sling сервлетов?

У меня есть несколько сервлетов, определенных в пакете OSGI. Я использую аннотации 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

Кажется, что после публикации нового jar-файла через веб-консоль felix, если я запрошу двойной селектор resource.v1.special.json перед любым другим ресурсом, MySpecialServlet также продолжит обрабатывать запросы только v1.

Есть ли способ заставить более общий сервлет обрабатывать более общий список селекторов, используя текущие аннотации? Я пропустил часть аннотации? Я считаю, что эта система может использовать более старую аннотацию. Может быть, стоит мигрировать? Я стараюсь не быть слишком навязчивым для этой маленькой задачи, которую меня попросили сделать.

Потерпите меня, если я объединил части этих технологий. Я только что подошел к этой проблеме, и я все еще разбираюсь с ней. Пожалуйста, исправьте любое несоответствие терминов.


person Marc    schedule 11.04.2018    source источник


Ответы (1)


Зарегистрируйте MySpecialServlet на v1.special, например selectors = {"v1.special"}.

Согласно документации:

... Селекторы должны быть настроены так, как они будут указаны в URL-адресе, который представляет собой список строк, разделенных точками, таких как print.a4 ...

Я понимаю, что при регистрации сервлета по списку селекторов Sling обрабатывает их по отдельности (как в условии ИЛИ). Итак, в случае регистрации вашего специального сервлета selectors = {"v1","special"}, метод doGet будет вызываться, если вы запросите:

  • http://localhost/my/resource.v1.special.json or
  • http://localhost/my/resource.special.json or
  • http://localhost/my/resource.v1.json
person iusting    schedule 12.04.2018
comment
Я не смог найти часть документации, в которой прямо говорилось, что sling рассматривает их как условие ИЛИ. Означает ли это, что resource.v1.special.json и resource.special.v1.json различны? Я посмотрел на наш код немного больше, и похоже, что кто-то коверкает селекторы в фильтре, прежде чем мы доберемся до разрешения, так что мои проблемы также могут быть - person Marc; 12.04.2018
comment
Я не имел в виду, что в DOC упоминается условие ИЛИ, скорее это то, что мы можем проверить сами, запустив некоторые тесты. Я изменил ответ, чтобы прояснить это. Конечно, вы можете использовать фильтр для предварительной обработки запроса, но строго в отношении регистрации селектора, я думаю, у вас есть v1.special (и special.v1, если вы не уверены в порядке), и это поможет. - person iusting; 13.04.2018
comment
Да, операционная — это то, к чему я пришел после тестирования. Между устранением селекторов в фильтре и использованием v1.special мне удалось заставить его работать. Тот, кто написал код, к которому я подошел, предположил, что список представляет собой операцию И. - person Marc; 13.04.2018