在两个蓝图之间共享一个属性

时间:2016-10-14 01:39:38

标签: spring apache-camel osgi blueprint-osgi

我正在尝试在蓝图1中定义属性并将其用作蓝图2中的默认属性。

两个蓝图都将加载到相同的Karaf OSGI容器中,但存在于不同的包中。清单已经设置了必要的依赖信息。

这是我的Blueprint1,它定义了我想在另一个蓝图中再次使用的属性:

<blueprint
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
    xsi:schemaLocation="
      http://www.osgi.org/xmlns/blueprint/v1.0.0
      https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<!-- Properties for this blueprint -->
<osgix:cm-properties id="sharedProperties" persistent-id="com.foo.project" update-strategy="reload"
                      xmlns="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0">
    <default-properties>
        <property name="shared-property" value="value"/>
    </default-properties>
</osgix:cm-properties>

<bean id="myBean"
      class="com.foo.MyClass">
    <property name="setting" value="{{shared-property}}"/>
</bean>

我的其他蓝图正在尝试使用&#34; my-property&#34;定义如上:

<blueprint
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
    xmlns:ctx="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.osgi.org/xmlns/blueprint/v1.0.0
      https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<!-- Load the properties from Blueprint1. Intent is to use property defined over there, here. -->
<osgix:cm-properties id="sharedProperties" persistent-id="com.foo.project"/>
<!-- Make properties defined in sharedProperties available using ${} syntax-->
<ctx:property-placeholder properties-ref="sharedProperties" />

<!-- Properties for this blueprint -->
<property-placeholder persistent-id="com.foo.project.blueprint2" update-strategy="reload"
                      xmlns="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
                      placeholder-prefix="{{{"
                      placeholder-suffix="}}}">
    <default-properties>
        <property name="my-property" value="${shared-property}"/>
    </default-properties>
</property-placeholder>

<bean id="myBean"
      class="com.foo.MyClass">
    <property name="setting" value="{{{my-property}}}"/>
</bean>

我有一种感觉(也许只是希望)这是接近正确但稍微偏离。如果它是正确的,我的问题可能是缺少名称空间处理程序。

1 个答案:

答案 0 :(得分:1)

使用&#34;默认属性&#34;标记您正在重新定义该值。从第二个项目中删除。另外,我建议从两者中删除default-properties并使用外部化的cfg文件,这样你在启动时就没有竞争条件。

删除它:

<default-properties>
    <property name="my-property" value="${shared-property}"/>
</default-properties>