将 sling:OsgiConfig 读入 @ObjectClassDefinition

Posted

技术标签:

【中文标题】将 sling:OsgiConfig 读入 @ObjectClassDefinition【英文标题】:Reading sling:OsgiConfig into @ObjectClassDefinition 【发布时间】:2020-12-10 11:48:54 【问题描述】:

我们有一个 OSGI 服务(使用 R7 DS 注释)。我们在服务中使用 OCD 作为内部类。

此外,我们希望组件从 JCR 中预定义的 sling:osgiconfig 节点读取属性。

根据需要定义配置策略。

当组件/服务加载时,它进入“无配置”状态。

需要帮助才能从 sling:osgiCongig 节点读取这些配置。

【问题讨论】:

即使 JCR 中存在 sling:osgiconfig 对应的 PID,组件仍处于“无配置”状态...请帮助 您的配置保存在哪里?可能是实例与sling:OsgiConfig 节点的位置之间的运行模式不匹配。如果您通过 CRX 包定义节点,您确定过滤器包含它们吗?你在 CRXDE 中看到它们了吗? 【参考方案1】:

sling:OsgiConfig 配置应该使用应该使用 OCD 配置的服务实现类名称来定义,而不是使用 OCD 名称。

OCD 基本上是可以有多种实现的接口。因此 sling:OsgiConfig 节点必须使用服务实现类名称来定义。例如,假设您有一个 SampleServiceImpl.class 定义一个 SampleOCDConfig.class 如下:

@Component(service = SampleService.class)
@Designate(ocd = SampleServiceImpl.Config.class)
public class SampleServiceImpl implements SampleService 

    public static final String DEFAULT_CUSTOM_CONFIG = "default configuration value";

    @ObjectClassDefinition(name = "Sample OCD Configuration")
    @interface Config 

        @AttributeDefinition(name = "The custom config", defaultValue = DEFAULT_CUSTOM_CONFIG)
        String custom_config() default DEFAULT_CUSTOM_CONFIG;

    
...

现在,当您为上述设置定义配置时,您必须如下定义:

/apps/your_project/config/your.sample.service.package.path.SampleServiceImpl.xml

内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
    jcr:primaryType="sling:OsgiConfig"
    custom.config="default configuration value" />

【讨论】:

我明白这一点。我们以相同的方式对其进行了编码。问题是当服务启动时它永远找不到配置并进入“无配置”状态。 但是,如果我们简单地配置组件,组件会预先填充 /apps/*/config 下定义的相同配置集。一旦我们为它存钱,它就会反映在服务中。我试图弄清楚为什么服务永远不会在 /apps/*/config 文件夹下找到配置并进入无配置状态...请帮助... 这很奇怪。如果按照上面提供的示例实施,它对我有用。能否分享您的代码 sn-p 以进行进一步分析? 当我们打开配置时,我们得到了 sling:osgiconfig 值......但是在组件激活时,我们得到一个空白的强迫症......这导致了问题......

以上是关于将 sling:OsgiConfig 读入 @ObjectClassDefinition的主要内容,如果未能解决你的问题,请参考以下文章

php关于ob_start('ob_gzhandler')启用GZIP压缩的bug

将OB86的故障信息保存在DB86中去

PHP操作:将数据库中的数据保存到Word中。

在STEP7 OB1块中如何写入FC105程序?

php 有时候难以输出显示的信息可以用ob缓冲区来做

csharp ObjectData扩展允许使用动态字典存储扩展任何.NET对象,GC将使用相关的ob收集它