Как мне получить селектор из слинга Ресурс - PullRequest
0 голосов
/ 26 октября 2018

У меня есть две модели Sling:

@Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class VideoGridItem {

  @SlingObject
  private Resource resource;

  @SlingObject
  private SlingHttpServletRequest slingHttpServletRequest;


  @PostConstruct
  public void initVideoGridItem() {
    String[] selectors = slingHttpServletRequest.getRequestPathInfo().getSelectors();
    insideGrid = selectors == null || selectors.length == 0 ? false : Arrays.stream(selectors).anyMatch("grid"::equals);
    url = URLUtils.addHTMLIfPage(resource.getResourceResolver(), linkUrl);
  }
}

и

@Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class VideoListing {

  private List<String> videoResourcePaths;

  @PostConstruct
  final void init() {

  }

}

Я вызываю компонент VideoGridItem (технически ресурс, который ссылается на модель) из компонента листинга видео с использованием HTL:

  <sly data-sly-list.videoResourcePath="${model.videoResourcePaths}">
    <sly data-sly-resource="${videoResourcePath @ wcmmode='disabled', addSelectors='grid'}" data-sly-unwrap="true"></sly>
  </sly>

Теперь, когда я отлаживаю код, внутри initVideoGridItem slingHttpServletRequest имеет значение null.Справедливо, этот ресурс не запрашивается напрямую, но мне все еще нужно иметь доступ к селектору «сетка».Есть ли способ, которым я могу сделать это из VideoGridItem.resource?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Извините, я не ответил раньше, но нашел свой дефект и пошел дальше.Проблема заключалась в том, что я создавал VideoGridItem, адаптируя его из ресурса в другом месте кода, и, конечно, Слинг не мог внедрить запрос.Теперь я отвечаю за нулевой запрос, и мой код работает хорошо.Спасибо за ваш ответ!

0 голосов
/ 13 ноября 2018
  1. Используйте аннотацию @org.apache.sling.models.annotations.injectorspecific.Self вместо @SlingObject для полей resource и slingHttpServletRequest.Самоинжектор вводит сам приспосабливаемый объект (т.е. запрос Sling), а также объекты, которые могут быть адаптированы из одного и того же (ресурса).
  2. Предполагая, что вам всегда нужно значение селектора для функционирования вашего компонента, выдолжен удалить Resource.class из списка адаптируемых типов в вашей аннотации @Model.Это предотвратит адаптацию вашего класса модели от объекта Resource, что приведет к тому, что поле slingHttpServletRequest станет пустым, а ваш метод @PostConstruct выдаст NullPointerException.
...