-1

我有两个吊索模型:

@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() {

  }

}

我使用 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 为空。公平地说,这个资源没有被直接请求,但我仍然需要能够访问选择器“网格”。有没有办法从 VideoGridItem.resource 做到这一点?

4

2 回答 2

1
  1. 使用@org.apache.sling.models.annotations.injectorspecific.Self注释而不是@SlingObjectresource字段slingHttpServletRequest。自注入器将注入自适应对象本身(即 Sling 请求)以及可从同一对象(资源)中自适应的对象。
  2. 假设您总是需要选择器值才能使组件起作用,您应该从注释Resource.class中的可适应类型列表中删除。@Model这将阻止您的模型类从Resource对象改编,这将导致该slingHttpServletRequest字段为空并且您的@PostConstruct方法将抛出一个NullPointerException.
于 2018-11-12T22:25:15.797 回答
0

对不起,我没有尽快回复,但我发现了我的缺陷并继续前进。问题是我通过从代码中另一个位置的资源调整它来创建一个 VideoGridItem,当然 Sling 无法注入请求。我现在正在考虑 null 请求,并且我的代码运行良好。感谢您的回答!

于 2018-11-14T15:47:07.773 回答