我和模特玩了很多次.做了一些很奇怪的事而且很有趣..。但是现在我碰到了一些我无法把头绕过去的东西。有源头的概念,也有via的概念。@Source是一个注释,它帮助我从可用的注册注入器中选择一个注射器,如果我想强制使用它,@Via可以帮助我改变给定注入器上下文中的默认注入行为。围绕这些问题,我有以下问题。
@Source和@Via有什么区别?我的理解是@Source告诉谁注入了值,并且它总是在@model注释中的适配表的上下文中。某些源不能工作,它的适配性是资源,而某些源不能工作是SlingHttpServletRequest中的适配程序。并在@Source @via的上下文中说明行为应该如何进行。这里有一个奇怪的例子,但是一个有效的例子
@Inject
@Source("child-resources")
@Named("topnav")
@Via(value = "jcr:content", type = ChildResource.class)
String text;意味着注入注入器“子资源”,节点的名称是"topnav“,在该上下文中,转到名为jcr:content的子节点并获得名为text的属性名。我知道我可以很容易地做到这一点,但这只是为了讨论。
到目前为止,我的理解正确吗?如果是,你还能给我举更多的例子吗?
@Model (adaptables={Resource.class, SlingHttpServletRequest.class}上有类似的东西。我试过这样做--从来没有像资源一样被对待过。SlingHttpServletRequest是优先的,因为@Self从来没有给我资源。@Inject从来没有给我价值地图的价值。我不得不添加@Via("resource"),这证明了SlingHttpServletRequest优先。这就引出了为什么要这样做的问题?真正的用途是什么,还是这只是一段错误的代码?发布于 2018-08-11 13:14:19
我试着回答2和4
2)是的,它们将标准注释聚合为一个,并在阅读时更好地暗示上下文。在这里阅读更多信息- https://sling.apache.org/documentation/bundles/models.html#custom-injectors-1
4)这不是吊索模型的行为。您选择一个对象,然后调整它,所以它总是请求或资源。哪一个取决于你试图适应的对象。您可以看到请求优先,因为您很可能通过Sightly脚本访问这些模型,而提供程序将提供对通过“data use”属性指定的对象的引用,而不是资源。
发布于 2018-08-13 00:20:28
我会按你问的顺序回答你的问题。
1) @Source告诉模型使用特定类型的喷射器进行注入,@Via告诉所选的喷射器使用不同的资源来获得将注入的值,然后是可适应的基。@Name用于标识属性,如果使用@Name,则忽略属性名。所以你的例子是
`resource.getChild("jcr:content").getValueMap().get("topNav",String.class)
2)是的,而且它们是最初版本的吊索模型的保持者。
3)这在很大程度上取决于您试图创建的模型的复杂性。参数无疑需要一个自定义喷射器,尽管在过去有关于将它添加到当前模型注入器的讨论。它可能比您通常能够做的事情更复杂,比如访问有关ServletRequest的元数据,例如IP注入器。
4)为了获得模型,您接受了一个支持适应性接口的对象并执行了apaptableObject.adaptTo(MyModel.class),Adaptable注释告诉模型可以使用哪种类型的对象来适应这个模型。最常用的是资源和SlingHttpServletRequest。所以,如果它总是被视为一个ServletRequest,那是因为您使用servletRequest作为您要适应模型的对象。不过,其中一个痛点是,几乎所有的注入器都处理请求,而不是所有的都处理资源。因此,如果模型同时接受这两种情况,就意味着您在使用何种注射器时受到了限制。
任何在包名中包含“吊带”的内容都是开源项目的一部分,而且他们的站点上有大量的信息。
https://stackoverflow.com/questions/51759463
复制相似问题