【问题标题】:AEM/Sling - How to create ResourceResolverFactory in a standalone code?AEM/Sling - 如何在独立代码中创建 ResourceResolverFactory?
【发布时间】:2017-06-02 04:51:14
【问题描述】:

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

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

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

谢谢 - 阿图尔

【问题讨论】:

    标签: java osgi aem jcr sling


    【解决方案1】:

    在 OSGi 环境之外引用 OSGi 服务

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

    在独立的 Java 应用程序中,从技术上讲,您可以在 Java 程序的 main 方法中启动框架。查看Apache Felix docs 了解如何操作。但老实说,如果您正在使用 AEM,我不认为这样做有什么意义。这只会让你的事情变得更复杂。无论如何,您都需要捆绑包,并且您将重新发明 AEM 已经为您做的事情。

    现在,如果您想做的是快速试验一些代码,而无需创建 OSGi 包的开销,我知道以下几种简单的方法:

    在 AEM 中试验代码

    在 AEM 中快速编写代码并对其进行测试的几种方法,无需创建完整的项目。

    AEM Groovy 控制台

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

    它很容易使用,只需安装它,打开控制台页面,输入你的脚本并执行它。

    它为许多常用对象提供了开箱即用的绑定,例如resourceResolversessionpageManagerqueryBuilderslingRequest 等。

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

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

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

    控制台甚至可以为你生成这段代码,它有一个很好的自动完成功能:

    查看the project on GitHub 了解更多信息。

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

    AEM HTL 复制

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

    玩弄 CRXDE

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

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

    【讨论】:

      【解决方案2】:

      如果您正在寻找 JSP 级别的代码 sn-p,下面的代码 sn-p 将创建一个调用此 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);
      %>
      

      【讨论】:

      • 实际上我正在寻找一种在独立的 java 程序中而不是在 jsp 或 OSGi 包中获取 ResourceResoverl 的方法。在我的 OSGi 包中,我可以通过 @Reference 注释获取工厂对象。我不知道如何在 Java 程序(带有主程序)中创建它们。例如
      • @Component(name = "com.cisco.wem.author.rendition.workflow.EOTRenditionPageCreation", specVersion = "1.1", metatype = true) @Service public class EOTRenditionPageCreation { @Reference private PageManagerFactory pageMangerFactory; @Reference ResourceResolverFactory resourceResolverFactory;
      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢大家的澄清!我现在了解 Sling 与 JCR API 之间的区别。
      【解决方案4】:

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

      为了在 AEM 中进行尝试,从 AEM Documentation 开始使用 AEM 样板项目会更容易。 OSGi 和 Sling 级别太低,它们唯一的实际值(在 AEM 的上下文中)位于 servlet 和组件模型绑定中。

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

      HTH

      【讨论】:

        【解决方案5】:

        您无法解析和实例化 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);
        

        【讨论】:

          猜你喜欢
          • 2018-03-31
          • 2018-10-19
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 2021-06-07
          • 2017-02-16
          • 1970-01-01
          • 2023-04-01
          相关资源
          最近更新 更多