java - AEM slingmodels - 为什么我们需要在每个模型中使用未使用的适配器?为什么需要 Resource 和 SlingHTTPRequest?
问题描述
我正在做一个项目,每个模型都有这条线:
@Model(adaptables = { SlingHttpServletRequest.class,Resource.class },
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
据我了解:
- 如果不使用 Resource 或 SlingHTTPRequest,则必须从模型中删除此依赖注入
- SlingHTTPRequest 无论如何都可以通过使用 .getResource 方法来帮助获取资源,所以单独使用 SlingHTTPServeltRequest 类,以及所需的dependencyInjectionStrategy 应该就足够了,并且永远不需要 Resource 类作为可适应的?
请分享你的想法。提前致谢!
解决方案
问题 1)
SlingModel 必须从 SlingHttpServletRequest 或资源创建/改编。它不能从无到有。
adaptables-property 指定可以从哪个对象创建它。
如果可以从两者创建 SlingModel,则脚本环境(例如 HTL 脚本)将使用资源。但是 SlingModels 也可以在其他地方使用,所以来源是随机的。
提示 1:不要同时使用这两种适配器。所以要么决定 SlingHttpServletRequest 要么资源。因为两者都可以,但是注入会有所不同-并且可能会导致奇怪的错误(至少它是薄冰,并且难以测试)。@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;
问题2
组件(以及 SlingModels)应该是上下文无关的,并由资源(= JCR 节点和 evtl。一些子节点)表示。因此,SlingModel 通常应该从资源改编而来。它也更容易在其他地方使用(在其他服务或吊索模型中)。
仅,如果您需要从请求中获取某些内容,则切换到 SlingHttpServletRequest。不幸的是,这通常是 URL 映射所需要的。但是限制自己访问 RequestAttributes。即使是 WcmMode 之类的东西也不应该在 SlingModel 中使用。最好将 SlingModels 视为资源的包装器,即访问数据的小型 Java 层。
提示 2:并非所有东西都是 SlingModel!您可以创建服务、Servlet、AdapterFactories、过滤器、重写器,...
推荐阅读
- php - 特殊常量 ::class 可以与变量一起使用吗?
- webpack - Webpack 4 升级 - 怀疑 mini-css-extract-plugin - CSS 从不加载 - Uncaught SyntaxError: Unexpected token
- jquery - 如何在 jQuery 中单击一次切换多个元素?
- python - 根据数组条件填写新的数据框列
- flask - 每当我尝试与 flask-wtf 一起使用时,主机名验证错误
- python - 如何从共享点上的给定文件夹中读取文件名
- visual-studio-extensions - VSIX - 知道何时插入片段
- python - Scikit 的 LabelEncoder 使用 `numpy.int64` 而不是 `inverse_transform` 中的整数
- .net - 如何使用 TopShelf 异步构建 windows 服务
- ios - UIView 高度不适合自定义标签栏