Utilizo el siguiente truco. Si especifica un atributo "objetivo" en la referencia de servicio pero deja su valor como cadena vacía, se usará una propiedad de componente con el mismo nombre pero con el sufijo ".target" en tiempo de ejecución.
En el ejemplo a continuación, selecciono mi fuente JDBC dinámicamente a través de un archivo .cfg en mi contenedor Karaf. La propiedad "datasourcefactory.target" se inyecta automáticamente en el atributo "objetivo" de la referencia "datasourcefactory".
Advertencia: en realidad no sé si este truco es oficialmente compatible o simplemente una característica SCR de Felix. He querido buscar esto en la especificación para ver si se menciona ... +1 a cualquier comentario que aclare su legalidad.
@Component(
name = "...",
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE,
metatype = true
)
@Property(name = "dataSourceFactory.target",
value = "",
label = "dataSourceFactory target",
description = "An OSGi service filter to select the data source provider. "+
"For example: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' where 'derby' is the important bit and the rest is boilerplate. "+
"See DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)."
)
@Reference(
name = "dataSourceFactory",
referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class,
cardinality = ReferenceCardinality.MANDATORY_UNARY,
target = "", // must be overwritten by configuration property named "dataSourceFactory.target"
bind = "bindDataSourceFactory",
unbind = "unbindDataSourceFactory"
)
He jugado con su primera sugerencia y parece que se ajustará perfectamente a nuestras necesidades. Gracias. – rancidfishbreath