问题标签 [sling-models]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
aem - 基于 Sling 选择器在 Sightly 中显示不同的标记
上下文
我正在开发一个使用 Sightly 作为模板语言的 AEM 6 项目。我面临一个用例,我想根据 Sling 选择器的存在来显示或隐藏标记的某些部分。
例如,一个请求/content/my-project/my-page.html
应该产生一个基本的页面视图,当一个请求被发送到 时/content/my-project/my-page.ubermode.html
,Sling 应该返回由一个稍微不同的 HTML 文档表示的相同内容。
根据Sling Cheat Sheet,应该可以使用不同的脚本。
我设法通过放置两个 Sightly 脚本在组件中实现了这一点,mycomponent.html
并且ubermode.html
(以选择器命名)
当涉及到 HTML 结构时,这确实需要一些代码重复,但它工作正常。
但是,在这种特殊情况下,我需要在渲染器级别做同样的思考(我们称之为 this myapp/core/renderers/fancyPageRenderer
)。更重要的是,渲染器有一个不同的渲染器sling:resourceSuperType
(我们称之为父渲染器myapp/core/renderers/genericPageRenderer
),并且依赖于一系列中等复杂的包含(data-sly-include
)。
在fancyPageRenderer
中,我覆盖了最初定义并包含在genericPageRenderer
. 这是我希望在使用ubermode
选择器时有所不同的部分。让我们调用这个脚本mainColumn.html
我尝试了不同的命名约定来匹配选择器,但它们都没有以令人满意的方式工作。
这是最初的结构
这是我尝试过的:
这根本行不通,mainColumn.html
每次都会包括在内。
这会导致uber.html
脚本被使用,但生成的页面不包含在其他脚本中定义的任何标记genericPageRenderer
我想我可以只复制所有相关的脚本和包含的内容,fancyPageRenderer
但这会导致大量且完全不可接受的代码重复。
我也知道可以手动添加、删除或替换选择器,data-sly-resource
或者只使用原始选择器,但在我的情况下,它data-sly-include
并没有data-sly-resource
被广泛使用。
有没有一种优雅的方法来解决这个问题?
aem - 如何在 aem6 的 sling 模型中适配子节点
我正在学习使用 AEM6 的一项新功能 - Sling Models。我已经按照此处描述的步骤获取了节点的属性
并从资源中改编
现在我的层次结构为 -
现在我想获取UserAddress
.
我从文档页面得到了一些提示,例如 -
如果注入的对象与所需的类型不匹配,并且该对象实现了 Adaptable 接口,Sling Models 将尝试对其进行适配。这提供了创建丰富的对象图的能力。例如:
当资源适应 时
MyModel
,名为 image 的子资源会自动适应 的实例ImageModel
。
但我不知道如何在我自己的课程中实现它。这个你能帮我吗。
aem - 如何实例化具有多个适应性的 Sling 模型
例如,Sling Models 中的@Model
注释允许多个可适配对象。
@Model(adaptables = { SlingHttpServletRequest.class, Resource.class })
但是,我不确定如何从 JSP 实例化具有多个可适配对象的模型。Sling 文档中显示的选项始终仅指定一个可适应的:https ://sling.apache.org/documentation/bundles/models.html#adaptto
aem - 使用 Sling 模型时使用 Sling 的 adaptTo 方法时出错
我们正在 AEM 6.0 中尝试示例吊索模型实施。
没有导入的吊索模型类是这样的:
使用以下代码行在 jsp 中调用 sling 模型
但是我们收到以下错误:
我们使用以下语句导入了 taglib:
最初,存在 2.2.0 版本的 Apache Sling JSP 标记库包。我们也尝试上传 2.2.4 版本,但没有帮助。
如果adapto标签可用,有人可以指导一下吗?
java - 资源解析器通过吊索模型返回为 null
Resource Resolver 在通过 sling 模型注入时返回为 null,如果我缺少任何东西,请告诉我:
我试过:
我也尝试过:
在这两种情况下,它都被返回为 null 并引发空指针异常。
让我知道我可能缺少什么来纠正这个错误。
java - 资源解析器通过 Sling Models Annotation 返回为 null
Resource Resolver 在通过 sling 模型注入时被返回为 null,如果我缺少任何东西,请告诉我:
我试过:
我也尝试过:
在这两种情况下,它都作为 null 返回,并在使用 ResourceResolver 时引发空指针异常。
让我知道我可能缺少什么来纠正这个错误。
aem - 从资源路径创建 Sling 模型
我想使用指向资源的路径从 JSP 实例化一个 Sling 模型,例如
在 Sling 模型中,我想通过@ValueMapValue
注释访问指定资源的属性。
我的问题是,如何使我的 Sling 模型适应资源路径字符串,以便注入指定资源的属性?
java - 关于如何在 SlingModel 上创建 changewatcher 以启用对 JCR 的持久性的建议
我们目前正在尝试实现对 SlingModels 的扩展,以允许将 slingmodel 直接持久化到 JCR。
我们的策略考虑了 2 个起始条件: 1. 一个要持久化的新对象 2. 从 JCR 中检索、更改并再次持久化的对象
对于情况 1,我们使用反射来检查对象,为模型创建一个新节点,为找到的任何原始变量插入属性,并递归地对任何作为变量和集合找到的复杂模型对象使用相同的持久性方法。
我关于最佳方法的问题与情况 2 相关。如果我们从存储库中拉出一个对象,我们不能保证该节点同时不会同步更改。因此,我们希望在 SlingModel 上实现一个更改观察器,以记录所做的任何更改的事务日志。然后,在将对象再次持久化回 JCR 时,可以使用这些事务来设置相关属性。
我考虑过使用观察者模式,但这意味着我们需要在每个 SlingModel 的 setter 中实现一个函数,这根本不理想,因为它需要开发人员记住添加代码并正确执行。
理想情况下,我想直接在变量上实现拦截器之类的东西,或者如果不可能的话,在 setter 本身上实现,并要求每个模型然后需要为每个变量使用 getter/setter。我们可以配置代码扫描工具来强制开发人员实现 getter/setter。
在这里接近变更观察者的最佳方式是什么?
maven - Sling 部署内容并与 maven 捆绑
我正在寻找基于 maven 的解决方案,以在我的 sling 独立服务器上部署 apache sling 包和内容(包括 jsp/html 等文件)。
我说这个私人项目是为了在不使用 AEM 的情况下了解视觉和吊索模型。这是我第一个唯一的吊索项目。
我已经从特定原型创建了一个 sling 包和一个 sling 内容项目。我已经声明使用 Eclipse Sling IDE 工具,但我习惯了 IntelliJ,并且没有插件可以以相同的方式部署内容。我认为可以使用 maven 构建和部署包含(捆绑和内容)的包。
希望你们中的某个人有一些说明或想法来解决这个问题,并让使用 apache sling 开发 Web 项目更加舒适。
干杯;)
osgi - 获取对 (Mock)ResourceResolverFactory 的引用
我有一个 Sling 模型类,其中包含对我的服务的引用:
该服务引用了 ResourceResolverFactory,以获取具有“管理员用户”的 ResourceResolver:
我正在编写一个单元测试来测试我的模型类上的 adaptTo。我正在尝试像这样注入对 PlanService 的引用:
但我不知道如何注入对 ResourceResolverFactory 的引用。
我试过这样:
但我得到这个错误:
我在文档和所有可用的模拟选项中找不到如何注入此服务并自动获取参考。任何帮助都会非常有帮助,谢谢!
编辑:感谢 Jérémie 的回答,ResourceResolverFactory 被注入到 PlanService 中。但是,我现在面临这个问题:
我尝试使用与 ResourceResolverFactory 相同的行:
并且还要添加
但它仍然是同样的问题......
编辑 2:用 SlingContext 而不是 OsgiContext 注册它解决了这个问题: