【问题标题】:Setting properties in Adobe CQ5在 Adob​​e CQ5 中设置属性
【发布时间】:2013-01-17 01:03:27
【问题描述】:

我正在开发基于 CQ5 的应用程序,这对我来说是一个全新的领域,因为我之前主要从事基于 Spring 的网络应用程序。

该应用是基于 Blue-prints 原型的 maven 项目(http://www.cqblueprints.com/xwiki/bin/view/Blue+Prints/The+CQ+Project+Maven+Archetype)。

现在我有一个问题,添加一些属性的标准方法是什么,通常会转到标准网络应用程序中的 config.properties(或类似文件)文件。包含 hostNames、accountNumbers 等内容的属性。

干杯。

【问题讨论】:

    标签: osgi aem sling


    【解决方案1】:

    我不熟悉蓝图,但据我了解,这只是生成 CQ 项目结构的一种方式,因此我认为它不会对您管理配置参数的方式产生任何实际影响。

    CQ5 基于Apache Sling,它使用 OSGi ConfigAdmin 服务来配置参数,并提供了一些工具来简化此操作。

    您可以在PathBasedDecorator Sling 组件中看到一个示例,它使用@Component 注解将自己声明为 OSGi 组件:

    @Component(metatype=true, ...)
    

    以后使用@Property注解声明一个多值可配置参数,带有默认值:

    @Property(value={"/content:2", "/sling-test-pbrt:2"}, unbounded=PropertyUnbounded.ARRAY)
    private static final String PROP_PATH_MAPPING = "path.mapping";
    

    然后在组件的 activate() 方法中读取该值:

      final Dictionary<?, ?> properties = componentContext.getProperties();
      final String[] mappingList = (String[]) properties.get(PROP_PATH_MAPPING);
    

    并且包含该组件的 OSGi 包提供了一个 metatype.properties 文件来定义可配置参数的名称和标签。

    就是这样 - 通过这个,Sling 和 OSGi 框架为组件生成一个基本的配置 UI,您可以从 /system/console/config 访问它,并在配置参数发生变化时自动管理组件的激活和重新激活。

    这些配置也可以来自 JCR 存储库,这要感谢 Sling 安装程序将它们提取到那里,您可以在 CQ5 存储库的 /libs 和 /apps 下名为“config”的文件夹中找到一些配置。

    另一种选择是直接使用 JCR 内容,具体取决于您的可配置参数的使用方式。您可以告诉您的组件其配置位于存储库中的 /apps/foo/myparameters 下(并仅使该值可配置),并根据需要在该节点下添加 JCR 属性和子节点,以便您的组件可以读取。缺点是你的@Component 在参数改变时不会自动重启,就像直接使用 OSGi 配置时一样。

    详细解释...希望这会有所帮助 ;-)

    【讨论】:

    • 嗨伯特兰,非常感谢您的回复。我看到了你的其他一些 sing 和 osgi 的 cmets,他们非常有帮助。我可能正在尝试做一些我习惯的事情,但对于给定的技术堆栈来说,这并不完全正确。基本上我试图使用 RunModes 并为每种模式添加一个配置文件,类似于定义日志配置的方式,但不知何故我无法读取它们:( 使用 'FrameworkUtil.getBundle(MyClass.class).getBundleContext ().getProperty(key)'
    【解决方案2】:

    非常感谢 Bertrand,您的回答确实为我指明了正确的方向。

    我所做的是为每个运行模式创建了 .ConfigService.xml,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"         xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="sling:OsgiConfig"
    myconfig.config="{String}My Value"/>
    

    然后在我的 ConfigService 中看起来像这样:

    @Component(immediate = true, metatype = true)
    @Service(ConfigService.class)
    public class ConfigService {
    
        private Dictionary<String, String> properties;
    
        @SuppressWarnings("unchecked")
        protected void activate(ComponentContext context) {
            properties = context.getProperties();
        }
    
        protected void deactivate(ComponentContext context) {
            properties = null;
        }
    
        public String getProperty(String key) {
            return properties.get(key);     
        }
    }
    

    如果我需要使用 @Reference 获取配置属性来访问它,我只使用 ConfigService。

    希望对大家有所帮助!

    【讨论】:

      【解决方案3】:

      ConfigService 示例可能不是最好的方法,因为 ComponentContext 仅应在组件激活和停用期间依赖。

      【讨论】:

      • 您能否提供一些信息,说明什么可能是更好的方法?
      • 嗨,大卫,感谢您的回复。您能否解释一下原因或提供更好的替代方案来使用特定于环境的属性? ConfigService 无论如何都只能由同一个包使用,我认为它不能消失,留下依赖服务(来自同一个包)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多