You need to make sure that the build tool you are using supports the
handling of bundle annotations.

This is at minimum bnd 4.1.0 (so maven-bundle-plugin 4.1.0,, Bndtools
4.1.0, bnd-maven-plugin 4.1.0). You may be able to get away with bnd 4.0.0
in some cases, but the support for bundle annotations wasn't quite complete
yet.

- Ray

On Wed, Jan 30, 2019 at 1:40 PM Nhut Thai Le <n...@castortech.com> wrote:

> Tim,
>
> I changed the text properties to annotations:
>
> @Component(service = Application.class)
> @JaxrsName(DiagramConstants.REST_APP)
> @JaxrsApplicationBase("diagram/services/diagrams/rest")
> public final class DiagramRestApp extends Application {}
>
> But i now see the service xml regenerated in my OSGI-INF folder lost the
> application base and name properties:
> <?xml version="1.0" encoding="UTF-8"?>
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0";
> activate="activate"
> name="com.castortech.iris.ba.diagrams.provider.servlet.DiagramRestApp">
>    <service>
>       <provide interface="javax.ws.rs.core.Application"/>
>    </service>
>    <implementation
> class="com.castortech.iris.ba.diagrams.provider.servlet.DiagramRestApp"/>
> </scr:component>
>
> Inspecting the service also yield that the properties are missing:
> se javax.ws.rs.core.Application
> ...
> {javax.ws.rs.core.Application}={service.id=580, service.bundleid=454,
> service.scope=bundle, 
> component.name=com.castortech.iris.ba.diagrams.provider.servlet.DiagramRestApp,
> component.id=1113}
>   "Registered by bundle:"
> com.castortech.iris.ba.diagrams.provider_1.0.0.qualifier [454]
>   "No bundles using service."
> ...
>
> Thus when i make a request to the REST api, i got 404.
>
> Is the missing properties causes aries jaxrs not pickup the service ? If
> it is, then do you have an idea why the properties is missing when using
> jaxrs annotations?
>
> Thai
>
>
> On Wed, Jan 30, 2019 at 11:56 AM Tim Ward <tim.w...@paremus.com> wrote:
>
>>
>>
>> On 30 Jan 2019, at 16:52, Nhut Thai Le <n...@castortech.com> wrote:
>>
>> Tim,
>>
>> Thank you for quickly identify my problems :D, please see my comments
>> inline
>>
>> On Wed, Jan 30, 2019 at 10:13 AM Tim Ward <tim.w...@paremus.com> wrote:
>>
>>> Hi,
>>>
>>> Firstly:
>>>
>>> Why does DiagramRestApp do this?
>>>
>>>   @Override
>>>   public Set<Object> getSingletons() {
>>>       return Collections.singleton(this);
>>>   }
>>>
>>>
>>> That is just all kinds of wrong!
>>>
>> i'm using aries-jaxrs-whiteboard for our REST api and i was was looking
>>> at the test to see how to build the Application class, i think this is what
>>> i was following:
>>> https://github.com/apache/aries-jax-rs-whiteboard/blob/master/jax-rs.itests/src/main/java/test/types/TestApplication.java.
>>> I got some errors at that time without the getSingletons() so i left it
>>> there. Now i just removed it and it seem fine.
>>>
>>
>> In this case the TestApplication class is a resource class (it declares
>> resource methods). It’s still horrible to do this, but it’s being done to
>> reduce the number of types in the test.
>>
>>
>>> Secondly, you’re using String properties everywhere rather than the
>>> annotations. This is asking for trouble with typos and inconsistencies.
>>> You are right, i should change to annotations
>>>
>>> Next:
>>>
>>> The following:
>>>
>>> @Component(
>>> service = CommonDiagramRESTService.class,
>>> property = {
>>> "osgi.jaxrs.extension=true",
>>> "osgi.jaxrs.name=CommonDiagramRESTService",
>>> "osgi.jaxrs.application.select=(osgi.jaxrs.name=DiagramRestApp)"
>>> }
>>> )
>>> @Path("/common")
>>> public final class CommonDiagramRESTService {..}
>>>
>>>
>>> and
>>>
>>> @Component(
>>> service = GridDiagramRESTService.class,
>>> property = {
>>>  "osgi.jaxrs.extension=true" ,
>>>  "osgi.jaxrs.name=GridDiagramRESTService",
>>>  "osgi.jaxrs.application.select=(osgi.jaxrs.name=DiagramRestApp)"
>>> }
>>> )
>>> @Path("/grid")
>>> public final class GridDiagramRESTService {...}
>>>
>>>
>>> These types declare that they are extensions - why? They don’t advertise
>>> any extension interfaces. They should advertise themselves as resources
>>> (which is what they are). I would not expect these to be picked up properly
>>> by the whiteboard as they are not extensions and they don’t advertise being
>>> resources.
>>>
>> Sorry, this is my typo, I'm using const so i replaced the const with
>> their values here so u can see how those classes are related, somehow i
>> replaced the property osgi.jaxrs.resource=true by
>> osgi.jaxrs.extension=true when copying here
>>
>>>
>>>
>>> What I observe is that the filter got activated 25 times, although all
>>> the resource classes and the filter bind to the same jaxrs application. Is
>>> this normal?
>>>
>>>
>>> Depending on the underlying implementation of the whiteboard and the
>>> registration order of the services this may or may not happen. Some JAX-RS
>>> implementations are not dynamic, in this case the whole application must be
>>> bounced when a change occurs. This will result in the currently registered
>>> services being discarded and re-created.
>>>
>>> Best Regards,
>>>
>>> Tim
>>>
>>>
>>> On 30 Jan 2019, at 15:01, Nhut Thai Le <n...@castortech.com> wrote:
>>>
>>> Tim,
>>>
>>> I have one jaxrs application:
>>> @Component(
>>> service = Application.class,
>>> property= {
>>> "osgi.jaxrs.name=DiagramRestApp",
>>> "osgi.jaxrs.application.base=/diagram/services/diagrams/rest"
>>> }
>>> )
>>> public final class DiagramRestApp extends Application {
>>>   @Override
>>>   public Set<Object> getSingletons() {
>>>       return Collections.singleton(this);
>>>   }
>>> }
>>> but multiple resource classes, about 25 of them, here is one
>>> @Component(
>>> service = CommonDiagramRESTService.class,
>>> property = {
>>> "osgi.jaxrs.extension=true",
>>> "osgi.jaxrs.name=CommonDiagramRESTService",
>>> "osgi.jaxrs.application.select=(osgi.jaxrs.name=DiagramRestApp)"
>>> }
>>> )
>>> @Path("/common")
>>> public final class CommonDiagramRESTService {..}
>>>
>>> and another one:
>>> @Component(
>>> service = GridDiagramRESTService.class,
>>> property = {
>>>  "osgi.jaxrs.extension=true" ,
>>>  "osgi.jaxrs.name=GridDiagramRESTService",
>>>  "osgi.jaxrs.application.select=(osgi.jaxrs.name=DiagramRestApp)"
>>> }
>>> )
>>> @Path("/grid")
>>> public final class GridDiagramRESTService {...}
>>>
>>> and finally my jaxrs filter:
>>> @Component(
>>> service = {
>>> ContainerRequestFilter.class,
>>> ContainerResponseFilter.class
>>> },
>>> scope = ServiceScope.PROTOTYPE,
>>> property = {
>>> "osgi.jaxrs.extension=true",
>>> "osgi.jaxrs.name=DiagramRestFilter",
>>> "osgi.jaxrs.application.select=(osgi.jaxrs.name=DiagramRestApp)"
>>> }
>>> )
>>> @PreMatching
>>> @Priority(Priorities.AUTHENTICATION)
>>> public final class DiagramRestFilter extends
>>> OsgiJaxrsBearerTokenFilterImpl implements ContainerResponseFilter {..}
>>>
>>> What I observe is that the filter got activated 25 times, although all
>>> the resource classes and the filter bind to the same jaxrs application. Is
>>> this normal?
>>>
>>> Thai
>>>
>>> On Tue, Jan 29, 2019 at 11:17 AM Nhut Thai Le <n...@castortech.com>
>>> wrote:
>>>
>>>> Thank you for clarifying.
>>>>
>>>> Thai
>>>>
>>>>
>>>>
>>>> On Tue, Jan 29, 2019 at 10:24 AM Tim Ward <tim.w...@paremus.com> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> As described in the JAX-RS Whiteboard spec
>>>>> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#d0e133685>
>>>>>  JAX-RS
>>>>> extension instances are required to be singletons (I’m talking about the
>>>>> objects, not the services) by the JAX-RS specification itself. Therefore
>>>>> within an application you will only ever see one instance of a whiteboard
>>>>> extension service.
>>>>>
>>>>> The reason that you should make extension services prototype is
>>>>> therefore not related to per-request handling, but instead because of what
>>>>> happens when the same extension service is applied to *multiple
>>>>> applications*. In this scenario you will have multiple applications with
>>>>> different configuration and different context objects. If your extension
>>>>> service is injected with these objects by the JAX-RS runtime (for example
>>>>> being injected with the Application using @Context) then which application
>>>>> is that for? In the general case you have no idea whether the context
>>>>> object you have been injected with relates to the current request or not.
>>>>>
>>>>> If your extension service is singleton or bundle scoped then the
>>>>> JAX-RS whiteboard can only get one instance. It therefore has to use this
>>>>> same instance for all of the whiteboard applications and you run into the
>>>>> potential “multiple injections” trap. This is obviously fine if you don’t
>>>>> have any injection sites, or if all your injection sites are method
>>>>> parameters, but it is a risky thing to do as someone may add an injection
>>>>> site later without realising that they’ve broken things. This will 
>>>>> probably
>>>>> also make it through testing as you’ll typically only have one application
>>>>> at a time when testing!
>>>>>
>>>>> If your extension service is prototype scope then the JAX-RS
>>>>> Whiteboard is able to get a different instance to use in each whiteboard
>>>>> application. At this point you no longer need to worry about multiple
>>>>> injections because the injections happen on different instances.
>>>>>
>>>>> I hope this answers your question, and helps to further explain why
>>>>> prototype scope is a good thing for filters!
>>>>>
>>>>> Best Regards,
>>>>>
>>>>> Tim
>>>>>
>>>>> On 29 Jan 2019, at 15:18, Raymond Auge via osgi-dev <
>>>>> osgi-dev@mail.osgi.org> wrote:
>>>>>
>>>>> I'm going to assume you are talking about:
>>>>>
>>>>> HttpService[1] or Http Whiteboard[2] w.r.t. the reference to Servlet
>>>>> AND
>>>>> JAX-RS Whiteboard[3] w.r.t. the reference to ContainerRequestFilter
>>>>>
>>>>> These 2(3) features are separate concerns and the
>>>>> ContainerRequestFilter of the JAX-RS whiteboard spec doesn't apply to the
>>>>> Servlets of the Http Whiteboard. You probably just want a regular old
>>>>> servlet Filter[4]
>>>>>
>>>>> Now it's possible that you are talking about some other runtime that
>>>>> packs all these things together. If so, you probably want to ask the
>>>>> implementors about this.
>>>>>
>>>>> Hope that helps clear things up,
>>>>> - Ray
>>>>>
>>>>> [1] https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html
>>>>> [2]
>>>>> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html
>>>>> [3] https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html
>>>>> [4]
>>>>> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121055
>>>>>
>>>>> On Tue, Jan 29, 2019 at 9:59 AM Nhut Thai Le via osgi-dev <
>>>>> osgi-dev@mail.osgi.org> wrote:
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I have a component implementing ContainerRequestFilter to intercept
>>>>>> REST calls and another component implements servlet.Filter. Both have
>>>>>> PROTOTYPE scope, my understanding is that these filter are instantiated 
>>>>>> and
>>>>>> activated for each web request but yesterday when i put some breakpoints 
>>>>>> in
>>>>>> the @activate method, i did not see them get called when a web request
>>>>>> arrives. Did I miss something? If they are not init/activate per request
>>>>>> why are they recomeded to be prototype?
>>>>>>
>>>>>> Thai Le
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>>>>>  (@rotty3000)
>>>>> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com/>
>>>>>  (@Liferay)
>>>>> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org/>
>>>>> (@OSGiAlliance)
>>>>> _______________________________________________
>>>>> OSGi Developer Mail List
>>>>> osgi-dev@mail.osgi.org
>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> Castor Technologies Inc
>>>> 460 rue St-Catherine St Ouest, Suite 613
>>>> Montréal, Québec H3B-1A7
>>>> (514) 360-7208 o
>>>> (514) 798-2044 f
>>>> n...@castortech.com
>>>> www.castortech.com
>>>>
>>>> CONFIDENTIALITY NOTICE: The information contained in this e-mail is
>>>> confidential and may be proprietary information intended only for the use
>>>> of the individual or entity to whom it is addressed. If the reader of this
>>>> message is not the intended recipient, you are hereby notified that any
>>>> viewing, dissemination, distribution, disclosure, copy or use of the
>>>> information contained in this e-mail message is strictly prohibited. If you
>>>> have received and/or are viewing this e-mail in error, please immediately
>>>> notify the sender by reply e-mail, and delete it from your system without
>>>> reading, forwarding, copying or saving in any manner. Thank you.
>>>> AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est
>>>> confidentiel, peut être protégé par le secret professionnel et est réservé
>>>> à l'usage exclusif du destinataire. Toute autre personne est par les
>>>> présentes avisée qu'il lui est strictement interdit de diffuser, distribuer
>>>> ou reproduire ce message. Si vous avez reçu cette communication par erreur,
>>>> veuillez la détruire immédiatement et en aviser l'expéditeur. Merci.
>>>>
>>>
>>>
>>> --
>>> Castor Technologies Inc
>>> 460 rue St-Catherine St Ouest, Suite 613
>>> Montréal, Québec H3B-1A7
>>> (514) 360-7208 o
>>> (514) 798-2044 f
>>> n...@castortech.com
>>> www.castortech.com
>>>
>>> CONFIDENTIALITY NOTICE: The information contained in this e-mail is
>>> confidential and may be proprietary information intended only for the use
>>> of the individual or entity to whom it is addressed. If the reader of this
>>> message is not the intended recipient, you are hereby notified that any
>>> viewing, dissemination, distribution, disclosure, copy or use of the
>>> information contained in this e-mail message is strictly prohibited. If you
>>> have received and/or are viewing this e-mail in error, please immediately
>>> notify the sender by reply e-mail, and delete it from your system without
>>> reading, forwarding, copying or saving in any manner. Thank you.
>>> AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est
>>> confidentiel, peut être protégé par le secret professionnel et est réservé
>>> à l'usage exclusif du destinataire. Toute autre personne est par les
>>> présentes avisée qu'il lui est strictement interdit de diffuser, distribuer
>>> ou reproduire ce message. Si vous avez reçu cette communication par erreur,
>>> veuillez la détruire immédiatement et en aviser l'expéditeur. Merci.
>>>
>>>
>>>
>>
>> --
>> Castor Technologies Inc
>> 460 rue St-Catherine St Ouest, Suite 613
>> Montréal, Québec H3B-1A7
>> (514) 360-7208 o
>> (514) 798-2044 f
>> n...@castortech.com
>> www.castortech.com
>>
>> CONFIDENTIALITY NOTICE: The information contained in this e-mail is
>> confidential and may be proprietary information intended only for the use
>> of the individual or entity to whom it is addressed. If the reader of this
>> message is not the intended recipient, you are hereby notified that any
>> viewing, dissemination, distribution, disclosure, copy or use of the
>> information contained in this e-mail message is strictly prohibited. If you
>> have received and/or are viewing this e-mail in error, please immediately
>> notify the sender by reply e-mail, and delete it from your system without
>> reading, forwarding, copying or saving in any manner. Thank you.
>> AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est
>> confidentiel, peut être protégé par le secret professionnel et est réservé
>> à l'usage exclusif du destinataire. Toute autre personne est par les
>> présentes avisée qu'il lui est strictement interdit de diffuser, distribuer
>> ou reproduire ce message. Si vous avez reçu cette communication par erreur,
>> veuillez la détruire immédiatement et en aviser l'expéditeur. Merci.
>>
>>
>>
>
> --
> Castor Technologies Inc
> 460 rue St-Catherine St Ouest, Suite 613
> Montréal, Québec H3B-1A7
> (514) 360-7208 o
> (514) 798-2044 f
> n...@castortech.com
> www.castortech.com
>
> CONFIDENTIALITY NOTICE: The information contained in this e-mail is
> confidential and may be proprietary information intended only for the use
> of the individual or entity to whom it is addressed. If the reader of this
> message is not the intended recipient, you are hereby notified that any
> viewing, dissemination, distribution, disclosure, copy or use of the
> information contained in this e-mail message is strictly prohibited. If you
> have received and/or are viewing this e-mail in error, please immediately
> notify the sender by reply e-mail, and delete it from your system without
> reading, forwarding, copying or saving in any manner. Thank you.
> AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est
> confidentiel, peut être protégé par le secret professionnel et est réservé
> à l'usage exclusif du destinataire. Toute autre personne est par les
> présentes avisée qu'il lui est strictement interdit de diffuser, distribuer
> ou reproduire ce message. Si vous avez reçu cette communication par erreur,
> veuillez la détruire immédiatement et en aviser l'expéditeur. Merci.
>


-- 
*Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
 (@rotty3000)
Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
 (@Liferay)
Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org> (@OSGiAlliance)
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to