Osgi Property Placeholder

2019-07-23 05:43发布

问题:

I can only use string binding here, enableRequestValidation should be always string, put in my bean i want to use boolean, how can i achieve this using property-placeholder bindings?

<property-placeholder 
    persistent-id="JsonValidator"
    update-strategy="reload" placeholder-prefix="$[" placeholder-suffix="]">
    <default-properties>
        <property name="enableRequestValidation" value="false"></property>
    </default-properties>
</property-placeholder>

<bean id="jsonSchemaRegistration"       class="rest.service.impl.jsonschema.JsonSchemaDynamicFeatureImpl">
    <property name="enableRequestValidation" value="$[enabledRequestValidation]"></property>
</bean>

Addition the exception is like below

2016-11-08 11:25:34,944 | ERROR | Thread-74        | BlueprintContainerImpl
      | 15 - org.apache.aries.blueprint.core - 1.4.4 | Unable to start blueprint
 container for bundle core.rest.service.impl/0.6.0.SNAP
SHOT
org.osgi.service.blueprint.container.ComponentDefinitionException: Error setting
 property: PropertyDescriptor <name: enableRequestValidation, getter: class core.rest.service.impl.jsonschema.JsonSchemaDynamicFeatureI
mpl.isEnableRequestValidation(), setter: [class JsonSchemaDynamicFeatureImpl.setEnableRequestValidati
on(boolean)]
        at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecip
e.java:939)[15:org.apache.aries.blueprint.core:1.4.4]
        at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRec
ipe.java:905)[15:org.apache.aries.blueprint.core:1.4.4]
        at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRec
ipe.java:886)[15:org.apache.aries.blueprint.core:1.4.4]

回答1:

Are you able to use Aries Blueprint Configuration Managagement? You don't provide any information about what your environment is, but using ServiceMix, I do this all the time. For example:

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

  <!-- OSGi blueprint property placeholder binding to a configuration file -->
  <config:property-placeholder id="myProps.props" persistent-id="myProps" update-strategy="reload">
    <config:default-properties>
      <config:property name="my.setting" value="true" />
    </config:default-properties>
  </config:property-placeholder>

  <bean id="myBean" class="org.me.MyClass">
    <property name="setting" value="${my.setting}" />
  </bean>
</blueprint>

Note the inclusion of verion 1.1.0 of the blueprint-cm namespace, which supports the update-strategy setting. The property injection will find the setSetting(boolean setting) method and attempt to convert the string to the boolean value. Here the default value of "true" is specified, but that can be overridden with changes to etc/myProps.cfg.



回答2:

Blueprint does not support property placeholders.