首页 > 解决方案 > 吊带型号说明

问题描述

我玩了很多模型……做了一些非常奇怪的事情,这很有趣……但现在我遇到了一些我无法理解的东西。有源的概念,也有通孔的概念。@Source是一个注释,如果我想强制一个,它可以帮助我从可用的已注册注入器中选择一个注入器,并@Via帮助我在给定注入器的上下文中更改默认注入行为。围绕这些,我有以下问题。

  1. @Source和有什么区别@Via

我的理解是@Source告诉谁注入了价值,并且它总是在您的@model注释中的可适应的上下文中。某些来源将不起作用,它的可适应性是资源,而某些来源将不起作用是可适应性的SlingHttpServletRequest。并在 a 的上下文中@Source @via告诉行为应该如何。这是一个奇怪的例子,但一个有效的例子

@Inject
@Source("child-resources")
@Named("topnav")
@Via(value = "jcr:content", type = ChildResource.class)
String text;

意味着使用注入器“子资源”注入,节点的名称是“topnav”,在该上下文中,转到被调用的子节点jcr:content并获取名为的属性名称text。我知道我可以用一行很容易地做到这一点,但这只是为了讨论。

到目前为止我的理解正确吗?如果是的话,你可以给我更多的例子吗?

  1. 是否使用注入器特定的注解(如 @ScriptVariable)只是为了减少代码行数,因为它们看起来只不过是两个或三个基本注解打包在一起。

  2. 我什么时候写一个自定义注入器?编写自定义注入器以从 servlet 获取请求参数是一个好场景吗?

  3. 现在最有趣的问题。我遇到了一些顶部有类似这样的东西的模型@Model (adaptables={Resource.class, SlingHttpServletRequest.class}。我试过这样做从来没有被视为资源。SlingHttpServletRequest优先,因为从来@Self没有给我资源。@Inject从不给我 valuemap 值。我不得不添加@Via("resource")哪个证明SlingHttpServletRequest优先。所以它让我想到为什么要这样做?真正的用途是什么,或者这只是一段错误的代码?

标签: modelaemsling

解决方案


我会按照你提出的顺序回答你的问题。

1)@Source 告诉模型使用特定类型的 Injector 进行注入,@Via 告诉选定的 Injector 使用不同的资源来获取将被注入的值,然后是基本的 Adaptable。@Name 用于标识属性,如果使用@Name,则属性名称将被忽略。所以你的例子发生了什么

`resource.getChild("jcr:content").getValueMap().get("topNav", String.class)

2) 是的,它们是原始版本的 Sling 模型的遗留物

3)这在很大程度上取决于您尝试创建的模型的复杂性。参数绝对是需要自定义注入器的东西,尽管过去曾讨论过将其添加到当前的模型注入器中。它可能比您通常能够执行的操作更复杂,例如访问有关 ServletRequest 的元数据,例如 IP 注入器。

4) 要获取模型,您需要一个支持 Adaptable 接口的对象,然后您执行 AdaptablesapaptableObject.adaptTo(MyModel.class)注释告诉模型可以使用哪种类型的对象来适应该模型。最常用的是 Resource 和 SlingHttpServletRequest。因此,如果它总是被视为 ServletRequest,那是因为您使用 servletRequest 作为您正在适应模型的对象。但其中一个痛点是几乎所有注入器都处理请求,但并非所有注入器都处理资源。因此,声明一个模型同时接受这两种方法,意味着您可以使用的喷油器受到限制。

包名称中包含“sling”的任何内容都是开源项目的一部分,并且在他们的网站上有大量信息。

https://sling.apache.org/documentation/bundles/models.html


推荐阅读