Osgi 在Adobe CQ5中设置属性

Osgi 在Adobe CQ5中设置属性,osgi,aem,sling,Osgi,Aem,Sling,我正在开发基于CQ5的应用程序,这对我来说是一个全新的领域,因为我以前主要是开发基于Spring的web应用程序 该应用程序是基于蓝图原型的maven项目(http://www.cqblueprints.com/xwiki/bin/view/Blue+打印/打印+CQ+项目+Maven+原型) 现在我有一个问题,添加一些属性的标准方法是什么,这些属性通常会转到标准web应用程序中的config.properties(或类似)文件。包含主机名、帐号等内容的属性 干杯。我不熟悉蓝图,但据我所知,这只

我正在开发基于CQ5的应用程序,这对我来说是一个全新的领域,因为我以前主要是开发基于Spring的web应用程序

该应用程序是基于蓝图原型的maven项目(http://www.cqblueprints.com/xwiki/bin/view/Blue+打印/打印+CQ+项目+Maven+原型)

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


干杯。

我不熟悉蓝图,但据我所知,这只是生成CQ项目结构的一种方法,因此我假设它对您管理配置参数的方式没有任何实际影响

CQ5基于,它使用OSGi ConfigAdmin服务来配置参数,并提供了一些工具来简化这一过程

您可以在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();
最终字符串[]映射列表=(字符串[])属性。获取(属性路径映射);
包含该组件的OSGi包提供了一个文件来定义可配置参数的名称和标签

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

这些配置也可以来自JCR存储库,多亏了Sling安装程序,您可以在CQ5存储库的/libs和/apps下名为“config”的文件夹中找到许多配置

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


详细解释…希望这有帮助;-)

非常感谢伯特兰,你的回答真的为我指明了正确的方向

我所做的是为每个运行模式创建.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"/>
@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);     
    }
}

然后在我的配置中,服务看起来是这样的:

<?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"/>
@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);     
    }
}
@组件(立即数=true,元类型=true)
@服务(ConfigService.class)
公共类配置服务{
私有字典属性;
@抑制警告(“未选中”)
受保护的无效激活(ComponentContext上下文){
properties=context.getProperties();
}
受保护的无效停用(ComponentContext上下文){
属性=null;
}
公共字符串getProperty(字符串键){
返回properties.get(key);
}
}
如果我需要使用@Reference获取访问它的配置属性,那么我只需使用ConfigService


我希望这能帮助别人

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

Hi Bertrand,非常感谢您的回复。我看到了你对sing和osgi的一些其他评论,它们非常有用。我可能正在尝试做一些我已经习惯了的事情,但是对于给定的技术堆栈来说,这些事情并不太合适。基本上,我尝试使用运行模式并为每个模式添加一个配置文件,类似于日志配置的定义方式,但不知何故我无法读取它们:(使用'FrameworkUtil.getBundle(MyClass.class).getBundleContext().getProperty(键)“您能提供一些关于更好方法的信息吗?您好,David,谢谢您的回复。您能解释一下为什么要使用特定于环境的属性,或者提供一个更好的替代方法吗?ConfigService是一种仅由同一捆绑包使用的服务,我假设它不会消失,留下从属服务。”冰(来自同一捆)在后面。