AEM / Sling - 如何在独立代码中创建ResourceResolverFactory?

时间:2017-01-17 23:19:25

标签: java osgi aem jcr sling

我正在尝试编写一些独立的代码而不是OSGi包,用于在AEM中学习和尝试。在OSGi包中,我可以使用ResourceResolverFactory注释获得@Reference

我想知道如何在我的独立代码中获得它。我需要这个工厂来获得ResourceResolver。我不确定这是否是独立代码中的可能性。

实际上,同一问题适用于另一家工厂,PageManagerFactory

由于 - 阿图尔

5 个答案:

答案 0 :(得分:3)

在OSGi环境之外提升OSGi服务

这根本不可能。您需要OSGi运行时才能使用OSGi服务,期间。

在独立的Java应用程序中,您可以从技术上在Java程序的main方法中启动框架。查看Apache Felix docs以了解具体方法。但说实话,如果你和AEM合作,我不明白这样做的意义。这让你的事情变得更加复杂。无论如何你都需要捆绑包,你首先要重塑AEM已经为你做的事情。

现在,如果您想要做的是快速尝试一些代码而不需要创建OSGi包的开销,这里有几个简单的方法我知道:

在AEM中尝试代码

有两种方法可以在AEM中快速编写代码并进行测试,而无需创建完整的项目。

AEM Groovy控制台

这是一个开源工具,允许您在AEM实例上执行Groovy代码。它使您可以访问Sling和JCR API,还允许您与OSGi服务进行交互。

它易于使用,只需安装,打开控制台页面,输入脚本并执行即可。

它提供了许多常用对象的Out Of the Box绑定,例如resourceResolversessionpageManagerqueryBuilderslingRequest等等。

它还提供了许多方便的方法,使Sling和JCR API更易于使用,以及一个非常简单的实用程序,允许您获取对OSGi服务的引用。

您询问了ResourceResolverFactory,以下是如何在脚本中获取一个:

def resourceResolverFactory = getService("org.apache.sling.api.resource.ResourceResolverFactory")

控制台甚至可以为您生成此代码,它具有很好的自动完成功能:

AEM Groovy Console autocomplete of OSGi services

查看the project on GitHub了解详情。

请注意,控制台本身使用了一堆OSGi包,因此代码实际上并不是独立的,因为它不是独立于OSGi环境而存在的。但是,用户不需要创建捆绑包并将其部署以试验代码。

AEM HTL REPL

您可能想要查看的另一个项目是AEM HTL REPL。我没有使用它,但我知道它允许您通过编写服务器端JavaScript来使用WCM使用API​​。

玩弄CRXDE

这基本上是@VAr's answer建议的内容。创建新组件或修改现有组件。

使用JSP scriptlet或使用WCM Use API的JavaScript。您可以在CRXDE中执行此操作,或使用实际的IDE编写代码,并使用Vault tool将其上载到AEM。 IntelliJEclipse有很好的插件,可以让它更容易一些。

答案 1 :(得分:1)

如果您正在寻找JSP级别的代码段,下面的代码片段将创建一个调用此jsp的页面版本。希望这会有所帮助。

<%@include file="/libs/foundation/global.jsp"%>
<%@page import="org.apache.sling.api.resource.Resource,
org.apache.sling.api.resource.ResourceResolver"%>
<% 
PageManager mypageManagerobj = resourceResolver.adaptTo(PageManager.class);
Page p= currentPage.getParent(0);
// below line will trigger a version creation process for the current page.
mypageManagerobj.createRevision(p);
%>

答案 2 :(得分:1)

我不相信这是可能的,因为ResourceResolverFactory是由OSGi提供支持的Apache Sling的一部分。

话虽这么说,您应该能够使用用于单元测试的SlingMocks库。这将允许您从JSON文件加载一些示例内容,并在内存存储库中执行操作。

仅供参考:独立的Java程序倾向于使用JCR API与AEM存储库进行交互。

答案 3 :(得分:1)

正如其他人所说,这是不可能的。 ResourceResolverFactory@ProviderType属性修饰。看到 ResourceResolverFactory Documentation。该属性使得实现对于OSGi框架非常特殊。

对于在AEM中尝试的事情,从AEM Documentation开始使用AEM锅炉板项目更容易。 OSGi和Sling的级别太低,它们唯一的真实单词值(在AEM的上下文中)位于servlet和组件模型绑定中。

作为参考,大多数独立的Apache Oak实用程序实现不使用ResourceResolver,而是使用类的具体引用(因此强加了严格的版本兼容性要求)。

HTH

答案 4 :(得分:0)

您无法解析和实例化OSGI服务,例如运行OSGI环境上下文代码的ResourceResolverFactory。但是,如果要在那里测试某些东西,可以访问存储库并读取一些节点(例如数据)。为此,您可以使用以下代码创建javax.jcr.Session:

import javax.jcr.Credentials; 
import javax.jcr.Repository; 
import javax.jcr.Session; 
import javax.jcr.SimpleCredentials;
org.apache.jackrabbit.commons.JcrUtils;

...

String repoUri = "repo uri", user = "admin", password = "admin";
Repository repository = JcrUtils.getRepository(repoUri);
Credentials creds = new SimpleCredentials(user, password.toCharArray());
Session session = repository.login(creds);