Thanks Benjamin! Enviado desde Yahoo Mail para Android El sáb., 10 de jun. de 2023 a la(s) 14:52, Benjamin Reed<ran...@opennms.org> escribió: It’s a pretty dry read, but all of this is basically part of the blueprint spec: https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.blueprint.html
On Jun 10, 2023, at 8:48 AM, z8sbk.yahoo.com.ar via user <user@karaf.apache.org> wrote: Hi JB!Yes, I could make it work after I changed the <bean> declaration for <reference>. I didn't know this was possible, is there an "official" (or not so official) documentation that explains DS, dependency injection in Karaf, and how to use it in a blueprint? Thanks! El sábado, 10 de junio de 2023, 01:54:23 ART, Jean-Baptiste Onofré <j...@nanthrax.net> escribió: Hi In blueprint, a bean (<bean/>) is searched inside the blueprint container. If you want to use a service declared outside of the blueprint container (DS in your case), you have to use <reference/>: it will create a bean proxying the OSGi service available in the OSGi registry (registered with OSGi "classic" code, DS, blueprint, whatever). Regards JB On Fri, Jun 9, 2023 at 5:21 PM z8sbk.yahoo.com.ar via user <user@karaf.apache.org> wrote: > > Hi, > I'm trying to understand how declarative service works. In a bundle, I have > these two clasess, very basic: > > @Component > public class App implements IApp { > > @Reference > private IConf conf; > > public App() {} > > public void doIt() { > > System.out.println("foo=" + conf.getFoo()); > > } > > } > > @Component(name = "Conf", immediate = true, configurationPid = "confByDS") > public class Conf implements IConf { > > private String foo = "bar"; > > > public Conf() {} > @Override > > public String getFoo() { > > return foo; > > } > > @Activate > @Modified > public void activate(ComponentContext context) { > > foo = context.getProperties().get("foo") != null ? (String) > context.getProperties().get("foo") : this.foo; > > } > > } > > Then, I have this blueprint/camel route: > > <?xml version="1.0" encoding="UTF-8"?> > <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> > > <bean id="app" class="com.app.App" /> > <camelContext xmlns="http://camel.apache.org/schema/blueprint"> > <route> > <from uri="timer:simple?period=5000"/> > <to uri="bean:app?method=doIt"/> > </route> > </camelContext> > > </blueprint> > > After deploying the bundle, when I put the blueprint in /deploy, throws a > NullPointerException in conf.getFoo(), which means that the Conf reference is > not injected: > > Message History > --------------------------------------------------------------------------------------------------------------------------------------- > RouteId ProcessorId Processor > Elapsed (ms) > [route3 ] [route3 ] [timer://simple?period=5000 > ] [ 7] > [route3 ] [to2 ] [bean:app?method=doIt > ] [ 0] > > Stacktrace > --------------------------------------------------------------------------------------------------------------------------------------- > java.lang.NullPointerException: null > at com.app.App.doIt(App.java:17) ~[!/:?] > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >~[?:1.8.0_321] > at >sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >~[?:1.8.0_321] > at >sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > ~[?:1.8.0_321] > > I think I'm misunderstanding how the DI in Karaf works plus DS, could you > please tell me what am I missing? Does DS work with Camel XML DSL routes? > > Thanks in advanced. > Nick. > >