AEM slingmodels - 为什么我们需要在每个模型中使用未使用的适配器?为什么需要 Resource 和 SlingHTTPRequest?

AEM slingmodels - why do we need unused adaptables in each model? Why need both Resource & SlingHTTPRequest?

我正在做一个项目,每个模型都有这条线:

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

据我了解:

  1. 如果不使用 Resource 或 SlingHTTPRequest,则必须从模型中删除此依赖项注入
  2. SlingHTTPRequest 无论如何都可以通过使用 .getResource 方法来帮助获取资源,因此单独使用 SlingHTTPServeltRequest class 和所需的 dependencyInjectionStrategy 应该就足够了,并且永远不需要 Resource class 作为适应性?

请分享您的想法。提前致谢!

是的,这不是强制性的。但是如果您的数据处于嵌套结构中(想想旋转木马中的幻灯片),并且您需要调整嵌套资源(幻灯片)以进行建模,则需要资源具有适应性。 request.getResource会给你组件资源,

此外,您可能必须在没有请求对象的情况下使用资源,例如在 workflowprocessstep 或 sling 作业处理器中。仅做 resource.adaptTo 的能力可以为您节省一些时间。

问题 1)

  • SlingModel 必须是来自 SlingHttpServletRequest 或资源的 created/adapted。它不能从无到有。

  • adaptables-属性指定,从哪个对象可以创建它。

  • 如果可以从两者创建 SlingModel,则脚本环境(例如 HTL 脚本)将使用资源。但是 SlingModels 也可以用在其他地方,所以来源是随机的。

提示 1:不要同时使用两种适应性。因此,要么决定使用 SlingHttpServletRequest 要么使用 Resource。因为两者都可以工作,但注入方式会有所不同 - 并且会导致奇怪的错误(至少它是如履薄冰,并且难以测试)。 @Self 的示例很简单,但其他一些注入器甚至更复杂,因为隐含地更改了 @Via。

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

@Self
// will be null, if adapted from Resource!!!
private SlingHttpServletRequest request;

@Self
// will be null, if adapted from SlingHttpServletRequest!!!
private Resource resource;

问题二

组件(以及 SlingModels)应该是上下文无关的,并由资源(= JCR 节点和 evtl。一些子节点)表示。 所以 SlingModel 通常应该从 Resource 改编而来。它也更容易在其他地方使用(在其他服务或吊索模型中)。

只是,如果你需要从请求中获取一些东西,那么切换到SlingHttpServletRequest。不幸的是,URL 映射通常需要这样做。但限制自己访问 RequestAttributes。甚至像 WcmMode 这样的东西也不应该用在 SlingModel 中。 最好将 SlingModels 视为资源周围的包装器,一个用于访问数据的小 Java 层。

提示 2:并非所有东西都是 SlingModel!您可以创建服务、Servlet、AdapterFactories、过滤器、重写器……