Io uso il seguente trucco. Se si specifica un attributo "target" sul riferimento del servizio ma si lascia il suo valore come stringa vuota , quindi una proprietà del componente con lo stesso nome ma un suffisso ".target" verrà utilizzato in fase di esecuzione.
Nell'esempio seguente, seleziono la mia sorgente JDBC in modo dinamico tramite un file .cfg nel mio contenitore Karaf. La proprietà "datasourcefactory.target" viene iniettata automaticamente nell'attributo "target" del riferimento "datasourcefactory".
Avvertenza: non so se questo trucco è ufficialmente supportato o solo una funzione SCR Felix. Volevo vedere questo nelle specifiche per vedere se è menzionato ... +1 a qualsiasi commento che chiarisca la sua legalità!
@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"
)
fonte
2012-04-30 02:58:30
Ho giocato con il tuo primo suggerimento e sembra che si adatta perfettamente ai nostri bisogni. Grazie. – rancidfishbreath