将 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的主要内容,如果未能解决你的问题,请参考以下文章