同一组件中的几个配置(@ Meta.OCD接口)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一组件中的几个配置(@ Meta.OCD接口)相关的知识,希望对你有一定的参考价值。

我有一个需要访问配置和配置的组件MyComponent:

my.MyComponent:

@Component(
    configurationPid = "[my.AConfiguration,my.BConfiguration]"
)
public class MyComponent {
    @Activate
    @Modified
    protected void activate(Map<String, Object> properties) {
        _aConfiguration = ConfigurableUtil
            .createConfigurable(AConfiguration.class, properties);
        _bConfiguration = ConfigurableUtil
            .createConfigurable(BConfiguration.class, properties);
    }

    public void hello() {
        System.out.println("A:" + _sConfiguration.valueA());
        System.out.println("B:" + _sConfiguration.valueB());
    }
}

my.AConfiguration:

@Meta.OCD(
    id = "my.AConfiguration"
)
public interface AConfiguration {
    @Meta.AD(deflt = "6")
    public long valueA();
}

my.BConfiguration:

@Meta.OCD(
    id = "my.BConfiguration"
)
public interface BConfiguration {
    @Meta.AD(deflt = "6")
    public long valueB();
}

问题:使用Liferay的配置UI将valueA和valueB配置为7无效,MyComponent.hello()仍然可以看到默认值6

我究竟做错了什么? 使组件使用来自多个配置界面的配置信息的正确方法是什么?

使用案例:我的组件执行一些业务处理并将结果保存到远程服务器。有一个配置界面包含业务处理设置,一个配置界面包含远程服务器的URL。

答案

configurationPid注释中@Component属性的格式是错误的。它应该是:

configurationPid = { "my.AConfiguration", "my.BConfiguration" }

这将创建一个String数组值,其中包含两个条目my.AConfigurationmy.BConfiguration。相反,您使用过:

configurationPid = "[my.AConfiguration,my.BConfiguration]"

...创建一个字符串值为[my.AConfiguration,my.BConfiguration]的字符串,这几乎肯定不是你想要的。

以上是关于同一组件中的几个配置(@ Meta.OCD接口)的主要内容,如果未能解决你的问题,请参考以下文章

@ConfigurationProperties的几个使用细节

OSGi:导出一个包而不导出同一个包中的几个类

vue组件中的几种传值方式----下篇

Servlet的几个关键知识点

Servlet的几个关键知识点

调用feign的接口的几个注意点