Hi Paul,
I have put the Rest service in a separate bundle but that does not help.
I created a simplified case:
Component(service = RestImpl.class)
@JaxrsResource
@JaxrsApplicationSelect("(" + JaxrsWhiteboardConstants.JAX_RS_NAME +
"=MyApplication)")
@JSONRequired
@Produces(MediaType.APPLICATION_JSON)
public class RestImpl {
@Reference
private PersonService personService;
@GET
@Path("/test")
public String test() {
System.out.println("personService == null " + (personService ==
null));
return "test";
}
}
@Component(service = Application.class, property =
{"servlet.init.hide-service-list-page=false"} )
@JaxrsApplicationBase("example")
@JaxrsName("MyApplication")
public class MyApplicationImpl extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> set = new HashSet<Class<?>>();
set.add(JacksonJsonProvider.class);
set.add(RestImpl.class);
return set;
}
public Set<Object> getSingletons() {
return Collections.<Object>singleton(RestImpl.class);
}
}
- Execution of endpoint /example/test results in personService == null, so no DI
- Disabling @JSONRequired results in personService != null, so DI work here
- Disabling @JaxrsApplicationSelect results in personService != null, so DI
work here
This drives me into the direction that there is no problem with dependencies.
It seems that if @JaxrsApplicationSelect and @JSONRequired are used at the same
time, no DI happens.
Best,
-- Jaap
> -----Original Message-----
> From: Paul Spencer <[email protected]>
> Sent: donderdag 26 januari 2023 00:32
> To: [email protected]
> Subject: Re: aries-jax-rs-whiteboard with @JaxrsApplicationSelect works not
> with DS
>
> Jaap,
> I suggest placing the PersonService in a separate bundle.
>
> Paul Spencer
>
>
> > On Jan 25, 2023, at 3:57 PM, Jaap Gordijn <[email protected]> wrote:
> >
> > Paul,
> >
> > The Rest class and the PersonService are in the same bundle.
> >
> > Do you know if there are any examples out there that show
> @JaxrsApplicationSelect in combination with DS?
> > It seems now that Application/@JaxrsApplicationBase ignores DS.
> >
> > -- Jaap
> >
> >> -----Original Message-----
> >> From: Paul Spencer <[email protected]>
> >> Sent: dinsdag 24 januari 2023 01:41
> >> To: [email protected]
> >> Subject: Re: aries-jax-rs-whiteboard with @JaxrsApplicationSelect
> >> works not with DS
> >>
> >> - Does bundle:headers for the REST bundle have a required capability
> >> to the Person Service, foo.bar.PersonService in the example below.
> >>
> >> karaf@root> bundle:headers <REST_bundle_id> ...
> >> Require-Capability =
> >>
> >> osgi.service;effective:=active;filter:=(objectClass=foo.bar.PersonSer
> >> vice),
> >> ...
> >>
> >> karaf@root>
> >>
> >>
> >> My assumption is the requirement is missing, meaning the requirement
> >> in the REST bundle is not defined correctly.
> >>
> >> Paul Spencer
> >>
> >>
> >>> On Jan 23, 2023, at 5:44 PM, Jaap Gordijn <[email protected]> wrote:
> >>>
> >>> Paul,
> >>>
> >>> - scr is installed and started
> >>> - the person bundle started
> >>> - diag does not produce any output
> >>>
> >>> Best,
> >>>
> >>> -- Jaap
> >>>
> >>>> -----Original Message-----
> >>>> From: Paul Spencer <[email protected]>
> >>>> Sent: maandag 23 januari 2023 23:12
> >>>> To: [email protected]
> >>>> Subject: Re: aries-jax-rs-whiteboard with @JaxrsApplicationSelect
> >>>> works not with DS
> >>>>
> >>>> Jaap,
> >>>> 1) What bundle provides PersonService and what is its state, as
> >>>> reported by bundle:list?
> >>>> 2) What is the state, as reported by bundle:list, of your REST bundle.
> >>>>
> >>>> If any of the bundles are in a state of waiting, what does
> >>>> bundle:diag <bundle_id> of the waiting bundle report?
> >>>>
> >>>> Is the feature scr installed, if not install it.
> >>>>
> >>>> Paul Spencer
> >>>>
> >>>>
> >>>>> On Jan 23, 2023, at 3:38 PM, Jaap Gordijn <[email protected]> wrote:
> >>>>>
> >>>>> Paul,
> >>>>>
> >>>>> I have now minimized the code that I call via REST:
> >>>>>
> >>>>> @Reference(scope=ReferenceScope.PROTOTYPE_REQUIRED)
> >>>>> private PersonService personService;
> >>>>>
> >>>>> @GET
> >>>>> @Path("/test")
> >>>>> public String test() {
> >>>>> System.out.println("personService null" +
> >>>>> (personService ==
> >>>> null));
> >>>>> return "test";
> >>>>> }
> >>>>>
> >>>>> The personService remains null, so no DI.
> >>>>>
> >>>>> I enabled DEBUG in the log.
> >>>>>
> >>>>> I only see DEBUG messages for " org.eclipse.jetty.util".
> >>>>> Not for anything else.
> >>>>>
> >>>>> Nevertheless, feature:list | grep jax Results in:
> >>>>>
> >>>>> aries-jax-rs-whiteboard │ 2.0.2 │ │
> >>>>> Started │ aries-
> >> jax-
> >>>> rs-2.0.2 │
> >>>>> aries-jax-rs-whiteboard-jackson │ 2.0.2 │ │
> >>>>> Started │
> >> aries-
> >>>> jax-rs-2.0.2 │
> >>>>> aries-jax-rs-whiteboard-jettison │ 2.0.2 │ │
> >>>>> Uninstalled │
> >>>> aries-jax-rs-2.0.2 │
> >>>>> aries-jax-rs-whiteboard-openapi │ 2.0.2 │ │
> >>>>> Uninstalled
> │
> >>>> aries-jax-rs-2.0.2 │
> >>>>> aries-jax-rs-whiteboard-rest-management │ 2.0.2 │ │
> >> Uninstalled
> >>>> │ aries-jax-rs-2.0.2 │
> >>>>> aries-jax-rs-whiteboard-shiro │ 2.0.2 │ │
> >>>>> Uninstalled │
> >> aries-
> >>>> jax-rs-2.0.2 │
> >>>>> jaxb │ 2.3.2.3 │ │
> >>>>> Uninstalled │ specs-4.4.3
> >>>> │
> >>>>> jaxrs │ 2.1.0 │ │
> >>>>> Uninstalled │ specs-4.4.3
> >>>> │
> >>>>> jaxws │ 2.3.0 │ │
> >>>>> Uninstalled │ specs-4.4.3
> >>>> │
> >>>>> jackson-jaxrs │ 2.14.1 │ │
> >>>>> Uninstalled │ specs-
> 4.4.3
> >>>> │
> >>>>> cxf-jaxb │ 3.5.5 │ │
> >>>>> Uninstalled │ cxf-3.5.5
> >>>> │
> >>>>> cxf-jaxws │ 3.5.5 │ │
> >>>>> Uninstalled │ cxf-3.5.5
> >>>> │
> >>>>> cxf-jaxrs │ 3.5.5 │ │
> >>>>> Started │ cxf-3.5.5
> >>>> │
> >>>>> cxf-databinding-jaxb │ 3.5.5 │ │
> >>>>> Uninstalled │ cxf-
> >> 3.5.5
> >>>> │
> >>>>> cxf-jaxrs-cdi │ 3.5.5 │ │
> >>>>> Uninstalled │ cxf-3.5.5
> >>>> │
> >>>>> karaf@root()>
> >>>>>
> >>>>> This gives me the impression that the whitenboard stuff is working.
> >>>>>
> >>>>> -- Jaap
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>
> >>>>>
> >>>>>> From: Paul Spencer <[email protected]>
> >>>>>> Sent: maandag 23 januari 2023 21:19
> >>>>>> To: [email protected]
> >>>>>> Subject: Re: aries-jax-rs-whiteboard with @JaxrsApplicationSelect
> >>>>>> works not with DS
> >>>>>>
> >>>>>> Jaap,
> >>>>>> Something is missing. The @Referenece should prevent the
> >> component
> >>>>>> from becoming Active when a PeopleService does not exist.
> >>>>>> Look in Karaf.log for clues.
> >>>>>>
> >>>>>> Paul Spencer
> >>>>>>
> >>>>>>> On Jan 23, 2023, at 3:14 PM, Jaap Gordijn <[email protected]>
> wrote:
> >>>>>>>
> >>>>>>> Paul,
> >>>>>>>
> >>>>>>> I tried also the @Reference annotation.
> >>>>>>> This doesn't work, the variable remains null.
> >>>>>>> No injection is happening.
> >>>>>>>
> >>>>>>> -- Jaap
> >>>>>>>
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: Paul Spencer <[email protected]>
> >>>>>>>> Sent: maandag 23 januari 2023 21:09
> >>>>>>>> To: [email protected]
> >>>>>>>> Subject: Re: aries-jax-rs-whiteboard with
> >>>>>>>> @JaxrsApplicationSelect works not with DS
> >>>>>>>>
> >>>>>>>> Jaap,
> >>>>>>>> In the code I posted, there was not constructor. I moved the
> >>>>>>>> injection of personService to an @Reference annotated field.
> >>>>>>>> The @Activator annotation is for a method, which you may not
> >>>>>>>> need based on
> >>>>>> your example.
> >>>>>>>>
> >>>>>>>> Paul Spencer
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>> On Jan 23, 2023, at 2:30 PM, Jaap Gordijn <[email protected]>
> >> wrote:
> >>>>>>>>>
> >>>>>>>>> Hi Paul,
> >>>>>>>>>
> >>>>>>>>> That constructor is called, but only if I disable
> >>>> @@JaxrsApplicationSelect.
> >>>>>>>>>
> >>>>>>>>> If I enable it, only the default constructor is called (Rest()
> >>>>>>>>> in my
> >> case.
> >>>>>>>>> And no DS.
> >>>>>>>>>
> >>>>>>>>> -- Jaap
> >>>>>>>>>
> >>>>>>>>>> -----Original Message-----
> >>>>>>>>>> From: Paul Spencer <[email protected]>
> >>>>>>>>>> Sent: maandag 23 januari 2023 18:59
> >>>>>>>>>> To: [email protected]
> >>>>>>>>>> Subject: Re: aries-jax-rs-whiteboard with
> >>>>>>>>>> @JaxrsApplicationSelect works not with DS
> >>>>>>>>>>
> >>>>>>>>>> Jaap,
> >>>>>>>>>> Your @Activate annotation is incorrect.
> >>>>>>>>>> Try the following.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> …
> >>>>>>>>>> public class Rest() {
> >>>>>>>>>>
> >>>>>>>>>> @Reference
> >>>>>>>>>> private PersonService personService;
> >>>>>>>>>>
> >>>>>>>>>> @Activate
> >>>>>>>>>> public void activate(Map <String,?> properties) { ...
> >>>>>>>>>> }
> >>>>>>>>>>
> >>>>>>>>>> }
> >>>>>>>>>>
> >>>>>>>>>> Paul Spencer
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>> On Jan 23, 2023, at 12:40 PM, Jaap Gordijn <[email protected]>
> >>>> wrote:
> >>>>>>>>>>>
> >>>>>>>>>>> Hi,
> >>>>>>>>>>>
> >>>>>>>>>>> I use an Application object (with @JaxrsApplicationSelect),
> >>>>>>>>>>> injection via DS does not work:
> >>>>>>>>>>>
> >>>>>>>>>>> @Component(service = Rest.class, scope =
> >>>> ServiceScope.PROTOTYPE)
> >>>>>>>>>>> @JaxrsResource @JaxrsApplicationSelect("(" +
> >>>>>>>>>>> JaxrsWhiteboardConstants.JAX_RS_NAME +
> >>>>>>>>>>> "=MyApplication)")
> >>>>>>>>>>> @JSONRequired
> >>>>>>>>>>> @Produces(MediaType.APPLICATION_JSON)
> >>>>>>>>>>> public class Rest {
> >>>>>>>>>>>
> >>>>>>>>>>> private PersonService personService;
> >>>>>>>>>>>
> >>>>>>>>>>> /*
> >>>>>>>>>>> public Rest() {
> >>>>>>>>>>> System.out.println("Constructing REST"); this.personService
> >>>>>>>>>>> = new PersonServiceImpl(); } */
> >>>>>>>>>>>
> >>>>>>>>>>> @Activate
> >>>>>>>>>>> public Rest(final @Reference PersonService personService) {
> >>>>>>>>>>> System.out.println("Constructing REST"); this.personService
> >>>>>>>>>>> = personService; }
> >>>>>>>>>>>
> >>>>>>>>>>> @GET
> >>>>>>>>>>> @Path("/person")
> >>>>>>>>>>> public List<PersonDto> listPersons() { return
> >>>>>>>>>>> personService.select(); }
> >>>>>>>>>>>
> >>>>>>>>>>> @GET
> >>>>>>>>>>> @Path("/test")
> >>>>>>>>>>> public String test() {
> >>>>>>>>>>> return "test";
> >>>>>>>>>>> }
> >>>>>>>>>>> }
> >>>>>>>>>>>
> >>>>>>>>>>> The @Activate constructor is not called. If I enable the
> >>>>>>>>>>> Rest() constructor that one is called.
> >>>>>>>>>>> if I disable @JaxrsApplicationSelect, the personService is
> >> injected.
> >>>>>>>>>>>
> >>>>>>>>>>> It seems that once an Application class is used (see below),
> >>>>>>>>>>> DS is not working.
> >>>>>>>>>>> This leads to the question what I have to set up for the
> >>>>>>>>>>> Application
> >>>>>>>> object:
> >>>>>>>>>>>
> >>>>>>>>>>> @Component(service=Application.class, property =
> >>>>>>>>>>> {"servlet.init.hide-service-list-page=true"} )
> >>>>>>>>>>> @JaxrsApplicationBase("example")
> >>>>>>>>>>> @JaxrsName("MyApplication")
> >>>>>>>>>>> public class MyApplication extends Application {
> >>>>>>>>>>>
> >>>>>>>>>>> public Set<Class<?>> getClasses() { HashSet<Class<?>> set =
> >>>>>>>>>>> new HashSet<Class<?>>(); set.add(Rest.class); return set;
> >>>>>>>>>>> }
> >>>>>>>>>>>
> >>>>>>>>>>> }
> >>>>>>>>>>>
> >>>>>>>>>>> Jax-rs-whiteboard 2.02
> >>>>>>>>>>> Karaf 4.4.3
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks,
> >>>>>>>>>>>
> >>>>>>>>>>> -- Jaap
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>
> >>>>>
> >>>
> >>>
> >
> >