Aem 如何从sling资源中获取选择器

Aem 如何从sling资源中获取选择器,aem,sling,sightly,htl,Aem,Sling,Sightly,Htl,我有两种吊索型号: @Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class VideoGridItem { @SlingObject private Resource resource; @SlingObject private SlingHttp

我有两种吊索型号:

@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)
公开课视频列表{
私有列表路径;
@施工后
最终void init(){
}
}
我使用HTL从视频列表组件调用VideoGridItem组件(技术上是引用模型的资源):

  <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中执行此操作

  • 对于
    资源
    slingHttpServletRequest
    字段,使用
    @org.apache.sling.models.annotations.injectorspecific.Self
    注释代替
    @SlingObject
    。自注入器将注入自适应对象本身(即Sling请求)以及可从同一对象(资源)进行自适应的对象
  • 假设组件始终需要选择器值才能正常工作,则应从
    @Model
    注释中的可适应类型列表中删除
    Resource.class
    。这将防止模型类从
    资源
    对象进行调整,这将导致
    slingHttpServletRequest
    字段为null,并且
    @PostConstruct
    方法将抛出
    NullPointerException

  • 很抱歉,我没有尽快回复,但我发现了自己的缺陷,继续前进。问题是,我是通过从代码中另一个地方的资源修改来创建VideoGridItem的,当然Sling无法插入请求。我现在正在考虑空请求,我的代码运行良好。谢谢你的回答

    共享您的VideoGridItem组件htl代码
      <sly data-sly-list.videoResourcePath="${model.videoResourcePaths}">
        <sly data-sly-resource="${videoResourcePath @ wcmmode='disabled', addSelectors='grid'}" data-sly-unwrap="true"></sly>
      </sly>