4

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

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

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

干杯。

4

3 回答 3

6

我不熟悉蓝图,但据我了解,这只是生成 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 配置时一样。

冗长的解释......希望这会有所帮助;-)

于 2013-01-17T09:02:51.883 回答
1

非常感谢 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。

我希望可以帮助别人!

于 2013-01-18T02:28:06.443 回答
0

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

于 2013-01-31T18:06:56.563 回答