【问题标题】:Accessing properties in Karaf cfg file from java?从java访问Karaf cfg文件中的属性?
【发布时间】:2015-11-20 13:17:52
【问题描述】:

我在蓝图中使用 cm:property-placeholder 来加载配置文件:

<!-- External configuration -->
<cm:property-placeholder persistent-id="mubyndle" update-strategy="reload">
    <cm:default-properties>
        <cm:property name="schemaValidation" value="false"/> 
    </cm:default-properties>
</cm:property-placeholder>

<bean id="myBean" class="com.mybean">
    <property name="abc" value="${abc}" />
</bean>

我可以在 bean 中设置值,例如 ${abc}。
如何从 java 访问配置的任何其他属性?

我打算添加属性列表: 道具1=11 道具2=22 ... propn=nn

由于数量不同,我无法在蓝图中全部添加。

谢谢你, 维克托

【问题讨论】:

    标签: osgi config karaf blueprint property-placeholder


    【解决方案1】:

    在蓝图中添加对 ConfigurationAdmin 服务的引用:
    &lt;reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" /&gt;

    设置为 bean:
    <bean id="myBean" class="com.mybean"> <property name="abc" value="${abc}" /> <property name="configAdmin" ref="configAdmin" /> </bean>

    在 bean 中:
    private ConfigurationAdmin configAdmin;

    public void setConfigAdmin(ConfigurationAdmin configAdmin) throws IOException {
        this.configAdmin = configAdmin;
    
        System.out.println(configAdmin);
        System.out.println(configAdmin.getConfiguration("any-persistent-id").getProperties());
    }
    

    【讨论】:

    【解决方案2】:

    您可以将org.apache.aries.blueprint.compendium.cm.CmPropertyPlaceholder
    设置为 myBean 为&lt;property name="cmpp" ref="cmpp" /&gt;
    在给它 id &lt;cm:property-placeholder id="cmpp" ... 之后。

    然后在 myBean 中为 cmpp 添加 setter:
    public void setProperties(CmPropertyPlaceholder properties) { Configuration config = CmUtils.getConfiguration(properties.getConfigAdmin(), properties.getPersistentId()); if (config != null) { Dictionary props = config.getProperties(); System.out.println(props); }

    唯一的问题是bundle org.apache.aries.blueprint.cm不导出包org.apache.aries.blueprint.compendium.cm,所以我无法在java中访问CmPropertyPlaceholder。 karaf 中是否有任何命令可以额外导出捆绑包?

    可以通过上下文访问配置,将查看并发布。

    【讨论】:

      【解决方案3】:

      你最好这样做:

      a) 在 blueprint.xml 中

      <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.1.0"
          xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
      

      ...

      <cm:property-placeholder persistent-id="<name of cfg file>"
          update-strategy="reload">
          <cm:default-properties>
              <cm:property name="<property name in file>" value="<value>" />
          </cm:default-properties>
      </cm:property-placeholder>
      
      
      <bean id="<name of Bean>" class="<full name of class>" >
          <property name="<property name in file>" value="${<value>}"></property>
      </bean>
      

      b) 在“bean”中

      • 定义一个公共构造函数(Spring需要定义)
      • 定义一个变量及其Setter:
      private <Type of> <name of variable>;
      public <Constructor> (){} // no parameters
      public void  set<property name in file first upper letter>(<Type of> <property name in file>) {
        <name of variable> = <property name A>;
      }
      

      c) 将配置文件添加到“/etc”文件夹中:

      &lt;name of cfg file&gt;.cfg

      显然,在其中,属性:

      &lt;Property name&gt; = &lt;value&gt;

      【讨论】:

      • 问题是如何设置值列表,不是逗号分隔,而是在配置文件中每行定义一个。
      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 2021-03-15
      相关资源
      最近更新 更多