Aries jax-rs whiteboard

classic Classic list List threaded Threaded
18 messages Options
Reply | Threaded
Open this post in threaded view
|

Aries jax-rs whiteboard

Matthias Leinweber-2
Hello Karaf Team,

I know that this not the 100% correct mailing list for aries jax-rs. However my question is what do you plan for further releases of Karaf? I try to use the aries implementation but I struggle with the configuration.
Beside the incomplete documentation and the "very special" DSL which is used I dug into the code and understood the following things.

* You can not add additional JAXRSApplications. ("osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/approot"} although there is code which should do this?
* Additional configurations for other then the default servlet is not possible although there is a service factory manager which should handle additional configs?
* With org.apache.aries.jax.rs.whiteboard.default.cfg # application.base.prefix you can add a global url prefix to your JaxRSResoureces. Would be nice if that could be documented somewhere.

Don't get me wrong I do not say that the bundle is bad, but at some point it could be easier to understand.

regards Matthias


Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

jbonofre
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:

> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com
Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 
Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 

Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 




Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 





Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 








Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

jbonofre
Hi Matthias,

The Aries JAXRS Whiteboard implementation uses CXF behind the hood ;)

Regards
JB

On 07/11/2019 17:24, Matthias Leinweber wrote:

> Great. Thank you very much.
>
> I dont want to add CXF or Jersey. thank to your answer I have come up
> with the idea myself to inject the  @Context HttpServletRequest into the
> JaxRS code. To mix in
> this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
> I didn't test it yet but does it work? I don't see that the aries JaxRs
> whiteboard impl somewhere
> defined osgi.http.whiteboard.servlet.multipart.enabled=true
>
> Best regards,
> Matthias
>
> Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]
> <mailto:[hidden email]>>:
>
>     Hi Matthias
>
>>     I was a bit confused about how you could add a Servelt to the
>>     JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file
>>     uploads.
>
>     I hope it’s now clear that the JAX-RS whiteboard does not support
>     Servlets. You can either:
>
>       * Register a servlet with the Http Whiteboard and find a place to
>         put the file
>       * Handle the multipart file upload using JAX-RS
>
>
>     If the file upload is only needed by your JAX-RS components then I
>     would recommend just using JAX-RS rather than a servlet.
>
>>     * So a JaxRsResource can but most not belong to an application?
>
>     A JAX-RS Whiteboard resource is just a “bare” resource in the
>     service registry. In the most common case the resource service that
>     you register will bind to the “default” application provided by the
>     JAX-RS Whiteboard. There is no need to deploy a custom whiteboard
>     application for resources to be hosted by the JAX-RS whiteboard.
>
>>     * It's fine to put all your Resources into the same
>>     JaxRsWhiteboard even if you could separate them?
>
>     Yes. This will work fine. All the resources (by default) will get
>     hosted in the default application. If you do want to provide some
>     isolation between the resources (e.g. if you need differently
>     configured JSON providers for different resources) then you can
>     still do this with a single JAX-RSWhiteboard, but you will need to
>     provide separate Applications for the resources and extensions. This
>     is because applications within the whiteboard *are* isolated from
>     each other, and can have different sets of resources and extensions.
>
>     In general, however, you’re pretty safe just registering all the
>     resources and extensions that you need directly with the whiteboard
>     using the default application.
>
>     All the best,
>
>     Tim
>
>
>>     On 7 Nov 2019, at 12:54, Matthias Leinweber
>>     <[hidden email] <mailto:[hidden email]>>
>>     wrote:
>>
>>     Hello Tim,
>>
>>     thanks for your reply. I get the JaxRS Application thing wrong. I
>>     thought that an application and a JaxRsResource is/can be the
>>     same. But obviously, if you read the documentation correct, then not.
>>     Then it also makes sense to inject the Application with @Context
>>     Applicaiton app into a method.
>>     I had also a misunderstanding with http and jaxrs whiteboard. I
>>     was a bit confused about how you could add a Servelt to the
>>     JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file
>>     uploads.
>>     I think the default app and the configuration of the default jaxrs
>>     whiteboard caused some confusion for me.
>>
>>     * So a JaxRsResource can but most not belong to an application?
>>     * It's fine to put all your Resources into the same
>>     JaxRsWhiteboard even if you could separate them?
>>
>>     right? then I think, I understood the thing and i like it :)
>>
>>     Best regards
>>     Matthias
>>
>>     Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward
>>     <[hidden email] <mailto:[hidden email]>>:
>>
>>>         in OSGI 6 I think we should be able to use
>>>         @Component(property = {"osgi.jaxrs.name
>>>         <http://osgi.jaxrs.name/>=myApp",
>>>         "osgi.jaxrs.application.base=/foo"}, service = A.class)
>>>         class...
>>>         That does not work or did I misunderstood something?
>>
>>         If you want to register an application with the whiteboard
>>         then you must register it as a javax.ws.rs
>>         <http://javax.ws.rs/>.core.Application in the service
>>         registry. This is outlined
>>         at https://osgi.org/specification/osgi.cmpou
>>         cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services
>>         <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#service.jaxrs.application.services>
>>
>>>         Second how do i create additional Servlets and how do I
>>>         select them in a resource?
>>>         E.g. A configfile/servicepid
>>>         org.apache.aries.jax.rs.whiteboard-bar.cfg
>>>         application.base.prefix=/bar
>>>         should create an additional servlet container?
>>
>>         I’m not sure that I totally follow here. It looks like you’re
>>         trying to create a configuration for another Aries JAX-RS
>>         whitboard instance - is this really what you want, a second
>>         JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to
>>         build on top of a compliant Http Whiteboard, if you are
>>         actually trying to create another Http Whiteboard (e.g. to get
>>         HTTP served on another port) then you will need to set that up
>>         in PAX-Web.
>>
>>>         Then with
>>>         @JaxrsWhiteboardTarget
>>>         or
>>>         "osgi.jaxrs.whiteboard.target="
>>>
>>>         I can select the servlet/Whiteboard, but how does the LDAP
>>>         string look? 
>>>         (service.pid=org.apache.aries.jax.rs.whiteboard-bar)?
>>
>>         This property only applies if you create more than one JAX-RS
>>         whiteboard, and would be applied to your JAX-RS Whiteboard
>>         services (resources, applications, extensions), and you would
>>         use the filter to select the JAX-RS Whiteboard that you wanted
>>         them to use. If you do want to do this, which seems unlikely,
>>         then you would typically add a marker property into the
>>         configuration for your JAX-RS Whiteboard and then use that
>>         property name/value in the filter.
>>
>>
>>         Any questions that relate to setting up the Http Whiteboard
>>         will need to be handled by someone with more PAX-Web
>>         experience. I would also recommend that, in addition to
>>         describing the problems that you’ve encountered, you include a
>>         description of what you’re trying to achieve with your system.
>>
>>         E.g.
>>
>>           * Do you want multiple Http ports being served (this would
>>             be Http Whiteboard not JAX-RS Whiteboard)?
>>           * Do you want JAX-RS Whiteboard support on top of one or
>>             more of the available Http Whiteboards)?
>>           * Do you want to publish JAX-RS resource services,
>>             application services, or a mixture of the two?
>>           * Do you want the JAX-RS services that you publish to appear
>>             on all whiteboards, or just a subset?
>>
>>
>>         With this information it will be much easier to help you to
>>         achieve your goal.
>>
>>         All the best,
>>
>>         Tim
>>
>>>         On 6 Nov 2019, at 17:25, Matthias Leinweber
>>>         <[hidden email]
>>>         <mailto:[hidden email]>> wrote:
>>>
>>>         Hi JB,
>>>         yes that was my first place to start... really like the
>>>         examples in the source, they are really helpful.
>>>
>>>         ok:
>>>         Fist thing are JAXRs Applications. In OSGI7 we will use
>>>         @JaxrsName("myApp")
>>>         @JaxrsApplicationBase("foo")
>>>         @Component
>>>         class....
>>>
>>>         in OSGI 6 I think we should be able to use
>>>         @Component(property = {"osgi.jaxrs.name
>>>         <http://osgi.jaxrs.name/>=myApp",
>>>         "osgi.jaxrs.application.base=/foo"}, service = A.class)
>>>         class...
>>>         That does not work or did I misunderstood something?
>>>
>>>         Second how do i create additional Servlets and how do I
>>>         select them in a resource?
>>>         E.g. A configfile/servicepid
>>>         org.apache.aries.jax.rs.whiteboard-bar.cfg
>>>         application.base.prefix=/bar
>>>         should create an additional servlet container?
>>>
>>>         Then with
>>>         @JaxrsWhiteboardTarget
>>>         or
>>>         "osgi.jaxrs.whiteboard.target="
>>>
>>>         I can select the servlet/Whiteboard, but how does the LDAP
>>>         string look? 
>>>         (service.pid=org.apache.aries.jax.rs.whiteboard-bar)?
>>>
>>>         Best regards,
>>>         Matthias
>>>
>>>
>>>         Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste
>>>         Onofré <[hidden email] <mailto:[hidden email]>>:
>>>
>>>             Hi Matthias,
>>>
>>>             did you take a look on the Karaf example ?
>>>
>>>             https://github.com/apache/karaf/tree/master/examples/karaf-rest-example
>>>
>>>             It contains different approaches, including whiteboard.
>>>
>>>             Can you describe a bit what you are looking for ? We can
>>>             then create the
>>>             Jira at Karaf/Aries to improve example/documentation.
>>>
>>>             Regards
>>>             JB
>>>
>>>             On 06/11/2019 17:56, Matthias Leinweber wrote:
>>>             > Hello Karaf Team,
>>>             >
>>>             > I know that this not the 100% correct mailing list for
>>>             aries jax-rs.
>>>             > However my question is what do you plan for further
>>>             releases of Karaf? I
>>>             > try to use the aries implementation but I struggle with
>>>             the configuration.
>>>             > Beside the incomplete documentation and the "very
>>>             special" DSL which is
>>>             > used I dug into the code and understood the following
>>>             things.
>>>             >
>>>             > * You can not add additional JAXRSApplications.
>>>             ("osgi.jaxrs.name <http://osgi.jaxrs.name/>
>>>             > <http://osgi.jaxrs.name
>>>             <http://osgi.jaxrs.name/>>=myApp",
>>>             "osgi.jaxrs.application.base=/approot"}
>>>             > although there is code which should do this?
>>>             > * Additional configurations for other then the default
>>>             servlet is not
>>>             > possible although there is a service factory manager
>>>             which should handle
>>>             > additional configs?
>>>             > * With org.apache.aries.jax.rs
>>>             <http://org.apache.aries.jax.rs/>.whiteboard.default.cfg
>>>             > # application.base.prefix you can add a global url
>>>             prefix to your
>>>             > JaxRSResoureces. Would be nice if that could be
>>>             documented somewhere.
>>>             >
>>>             > Don't get me wrong I do not say that the bundle is bad,
>>>             but at some
>>>             > point it could be easier to understand.
>>>             >
>>>             > regards Matthias
>>>             >
>>>             >
>>>
>>>             --
>>>             Jean-Baptiste Onofré
>>>             [hidden email] <mailto:[hidden email]>
>>>             http://blog.nanthrax.net <http://blog.nanthrax.net/>
>>>             Talend - http://www.talend.com <http://www.talend.com/>
>>>
>>>
>>>
>>>         -- 
>>
>>
>>
>>
>
>
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com
Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
In reply to this post by Matthias Leinweber-2
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 









Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 











Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 












Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Oleg Cohen
Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);


private JacksonJsonProvider jsonProvider;


@Activate
private void activate() {


logger.info(“MyApplication.activate(): Entry ...");


ObjectMapper objectMapper = new ObjectMapper();


objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);


objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);


objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);


jsonProvider = new JacksonJsonProvider(objectMapper);


logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}


    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();

        

        singletons.add(jsonProvider);

        return singletons;
    }

}



On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 
















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Well yes that works but there must be a way to use JsonProviderPrototypeServiceFactory provided by the bundle: org.apache.aries.jax.rs.jackson.

regards Matthias

Am Fr., 15. Nov. 2019 um 16:35 Uhr schrieb Oleg Cohen <[hidden email]>:
Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);


private JacksonJsonProvider jsonProvider;


@Activate
private void activate() {


logger.info(“MyApplication.activate(): Entry ...");


ObjectMapper objectMapper = new ObjectMapper();


objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);


objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);


objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);


jsonProvider = new JacksonJsonProvider(objectMapper);


logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}


    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();

        

        singletons.add(jsonProvider);

        return singletons;
    }

}



On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 


















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
In reply to this post by Oleg Cohen
Hi Matthias,

So from the example that you’ve given I’m not sure why you have the whiteboard application at all. Providing an empty whiteboard application doesn’t really give you any benefit - the primary use case is for registering existing non-OSGi JAX-RS applications, or for where you already have a bunch of resource classes.

In any event, the reason that what you have isn’t working for you is that the JSON extension isn’t targeting your application. It’s not enough to just put "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)” on the resource, it must also go on the extension, meaning that you need to configure the Aries JAX-RS support to add that property.


The other suggested fix, as Oleg outlined, is for example:

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
    })
public class MyApp extends Application {
    @Reference(target="(osgi.jaxrs.name=jaxb-json)”)
    Object writer;
    
    @Override
    public Set<Object> getSingletons() {
        Feature f = fc -> fc.register(writer, MessageBodyWriter.class, MessageBodyReader.class);
        Set<Object> singletons = new HashSet<>();
        singletons.add(f);
        return singletons;
    }
}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
    })
public class MyService ...


On 15 Nov 2019, at 15:35, Oleg Cohen <[hidden email]> wrote:

Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);

private JacksonJsonProvider jsonProvider;

@Activate
private void activate() {

logger.info(“MyApplication.activate(): Entry ...");

ObjectMapper objectMapper = new ObjectMapper();

objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

jsonProvider = new JacksonJsonProvider(objectMapper);

logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}

    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();
        
        singletons.add(jsonProvider);

        return singletons;
    }
}


On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 

















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Hello Tim,

thank you, again you improved my knowledge. I just stripped my code for simplicity. 

Ok, but why and how does it work for the default application?
There i don't need to select an extension in the resource but serialization works? I can not see that JsonProviderPrototypeServiceFactory somehow adds a property for the default app. Or is there some voodoo with SERVICE_RANKING?. Tbh i don't even find the point where the configuration for pid org.apache.aries.jax.rs.jackson is created.

Besides the versioning of org.apache.aries.jax.rs.jackson seems broken and the feature has a hardcoded dep on version 1.0.0 which source i cant find at all.. and the artifacts in current source aren't build at all.

kr,
Matthias

So somehow the extension selection logic looks odd. Or is this made media-type mapping?


Tim Ward <[hidden email]> schrieb am Fr., 15. Nov. 2019, 17:23:
Hi Matthias,

So from the example that you’ve given I’m not sure why you have the whiteboard application at all. Providing an empty whiteboard application doesn’t really give you any benefit - the primary use case is for registering existing non-OSGi JAX-RS applications, or for where you already have a bunch of resource classes.

In any event, the reason that what you have isn’t working for you is that the JSON extension isn’t targeting your application. It’s not enough to just put "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)” on the resource, it must also go on the extension, meaning that you need to configure the Aries JAX-RS support to add that property.


The other suggested fix, as Oleg outlined, is for example:

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
    })
public class MyApp extends Application {
    @Reference(target="(osgi.jaxrs.name=jaxb-json)”)
    Object writer;
    
    @Override
    public Set<Object> getSingletons() {
        Feature f = fc -> fc.register(writer, MessageBodyWriter.class, MessageBodyReader.class);
        Set<Object> singletons = new HashSet<>();
        singletons.add(f);
        return singletons;
    }
}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
    })
public class MyService ...


On 15 Nov 2019, at 15:35, Oleg Cohen <[hidden email]> wrote:

Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);

private JacksonJsonProvider jsonProvider;

@Activate
private void activate() {

logger.info(“MyApplication.activate(): Entry ...");

ObjectMapper objectMapper = new ObjectMapper();

objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

jsonProvider = new JacksonJsonProvider(objectMapper);

logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}

    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();
        
        singletons.add(jsonProvider);

        return singletons;
    }
}


On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 

















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Tim Ward-2
Hi,

Ok, but why and how does it work for the default application?… I can not see that JsonProviderPrototypeServiceFactory somehow adds a property for the default app.

The reason that it works in the default application is that, by default, whiteboard resources and extensions target the default application. Note that in the JavaDoc for the application select property it says that "Services without this service property are bound to the default Application.” 

The reason that this works is therefore that the MessageBodyReader/MessageBodyWriter service supplying JSON support in your application is now targeting the same application as your whiteboard resource. The other option that I outlined was effectively the reverse approach to reach the same goal, namely adding an application select filter to the JSON extension service.

There i don't need to select an extension in the resource but serialization works?

Technically you *do* still need to select the extension in order for things to work 100% reliably. You can see this by investigating what happens when you stop the Aries Jackson bundle. You will see that your resource service is still hosted by the whiteboard, but that it explodes because there is no JSON support. What the extension select filter does is to tell the whiteboard not to host your whiteboard service until an appropriate extension is also present. In the absence of this filter your resource will always be hosted, whether the JSON support is available or not. Most of the time, however (basically at all times after startup has finished) your application will have both services and everything will work fine.

Or is there some voodoo with SERVICE_RANKING?

There isn’t any voodoo with service ranking in the spec, except to say that if you have two services that could provide the same endpoint (or the same extension support) then the higher ranked service will win. Service ranking plays no role in the examples that we’ve been working with.

Tbh i don't even find the point where the configuration for pid org.apache.aries.jax.rs.jackson is created.

That’s because there isn’t one. The service starts up with its default configuration (which is good enough for many cases) and doesn’t require configuration admin in order to run.

Besides the versioning of org.apache.aries.jax.rs.jackson seems broken and the feature has a hardcoded dep on version 1.0.0 which source i cant find at all.. and the artifacts in current source aren't build at all.

This is the CI job for the Aries JAX-RS Whiteboard integration projects, which are built separately from the whiteboard because they evolve at different speeds.


I see releases 1.0.0 to 1.0.2 in Maven Central, all of them with source jars.


I hope this helps, all the best,

Tim

On 17 Nov 2019, at 17:27, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thank you, again you improved my knowledge. I just stripped my code for simplicity. 

Ok, but why and how does it work for the default application?
There i don't need to select an extension in the resource but serialization works? I can not see that JsonProviderPrototypeServiceFactory somehow adds a property for the default app. Or is there some voodoo with SERVICE_RANKING?. Tbh i don't even find the point where the configuration for pid org.apache.aries.jax.rs.jackson is created.

Besides the versioning of org.apache.aries.jax.rs.jackson seems broken and the feature has a hardcoded dep on version 1.0.0 which source i cant find at all.. and the artifacts in current source aren't build at all.

kr,
Matthias

So somehow the extension selection logic looks odd. Or is this made media-type mapping?


Tim Ward <[hidden email]> schrieb am Fr., 15. Nov. 2019, 17:23:
Hi Matthias,

So from the example that you’ve given I’m not sure why you have the whiteboard application at all. Providing an empty whiteboard application doesn’t really give you any benefit - the primary use case is for registering existing non-OSGi JAX-RS applications, or for where you already have a bunch of resource classes.

In any event, the reason that what you have isn’t working for you is that the JSON extension isn’t targeting your application. It’s not enough to just put "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)” on the resource, it must also go on the extension, meaning that you need to configure the Aries JAX-RS support to add that property.


The other suggested fix, as Oleg outlined, is for example:

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
    })
public class MyApp extends Application {
    @Reference(target="(osgi.jaxrs.name=jaxb-json)”)
    Object writer;
    
    @Override
    public Set<Object> getSingletons() {
        Feature f = fc -> fc.register(writer, MessageBodyWriter.class, MessageBodyReader.class);
        Set<Object> singletons = new HashSet<>();
        singletons.add(f);
        return singletons;
    }
}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
    })
public class MyService ...


On 15 Nov 2019, at 15:35, Oleg Cohen <[hidden email]> wrote:

Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);

private JacksonJsonProvider jsonProvider;

@Activate
private void activate() {

logger.info(“MyApplication.activate(): Entry ...");

ObjectMapper objectMapper = new ObjectMapper();

objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

jsonProvider = new JacksonJsonProvider(objectMapper);

logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}

    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();
        
        singletons.add(jsonProvider);

        return singletons;
    }
}


On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


-- 


















Reply | Threaded
Open this post in threaded view
|

Re: Aries jax-rs whiteboard

Matthias Leinweber-2
Well thank you for all the explanations I finally went for Olegs solution.
I also tried to create a component service factory for a PrototypeServiceFactory<JacksonJsonProvider> with the required properties to select my application, but I failed.

Best regards and thank you,
Matthias

Am Mo., 18. Nov. 2019 um 11:34 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Ok, but why and how does it work for the default application?… I can not see that JsonProviderPrototypeServiceFactory somehow adds a property for the default app.

The reason that it works in the default application is that, by default, whiteboard resources and extensions target the default application. Note that in the JavaDoc for the application select property it says that "Services without this service property are bound to the default Application.” 

The reason that this works is therefore that the MessageBodyReader/MessageBodyWriter service supplying JSON support in your application is now targeting the same application as your whiteboard resource. The other option that I outlined was effectively the reverse approach to reach the same goal, namely adding an application select filter to the JSON extension service.

There i don't need to select an extension in the resource but serialization works?

Technically you *do* still need to select the extension in order for things to work 100% reliably. You can see this by investigating what happens when you stop the Aries Jackson bundle. You will see that your resource service is still hosted by the whiteboard, but that it explodes because there is no JSON support. What the extension select filter does is to tell the whiteboard not to host your whiteboard service until an appropriate extension is also present. In the absence of this filter your resource will always be hosted, whether the JSON support is available or not. Most of the time, however (basically at all times after startup has finished) your application will have both services and everything will work fine.

Or is there some voodoo with SERVICE_RANKING?

There isn’t any voodoo with service ranking in the spec, except to say that if you have two services that could provide the same endpoint (or the same extension support) then the higher ranked service will win. Service ranking plays no role in the examples that we’ve been working with.

Tbh i don't even find the point where the configuration for pid org.apache.aries.jax.rs.jackson is created.

That’s because there isn’t one. The service starts up with its default configuration (which is good enough for many cases) and doesn’t require configuration admin in order to run.

Besides the versioning of org.apache.aries.jax.rs.jackson seems broken and the feature has a hardcoded dep on version 1.0.0 which source i cant find at all.. and the artifacts in current source aren't build at all.

This is the CI job for the Aries JAX-RS Whiteboard integration projects, which are built separately from the whiteboard because they evolve at different speeds.


I see releases 1.0.0 to 1.0.2 in Maven Central, all of them with source jars.


I hope this helps, all the best,

Tim

On 17 Nov 2019, at 17:27, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thank you, again you improved my knowledge. I just stripped my code for simplicity. 

Ok, but why and how does it work for the default application?
There i don't need to select an extension in the resource but serialization works? I can not see that JsonProviderPrototypeServiceFactory somehow adds a property for the default app. Or is there some voodoo with SERVICE_RANKING?. Tbh i don't even find the point where the configuration for pid org.apache.aries.jax.rs.jackson is created.

Besides the versioning of org.apache.aries.jax.rs.jackson seems broken and the feature has a hardcoded dep on version 1.0.0 which source i cant find at all.. and the artifacts in current source aren't build at all.

kr,
Matthias

So somehow the extension selection logic looks odd. Or is this made media-type mapping?


Tim Ward <[hidden email]> schrieb am Fr., 15. Nov. 2019, 17:23:
Hi Matthias,

So from the example that you’ve given I’m not sure why you have the whiteboard application at all. Providing an empty whiteboard application doesn’t really give you any benefit - the primary use case is for registering existing non-OSGi JAX-RS applications, or for where you already have a bunch of resource classes.

In any event, the reason that what you have isn’t working for you is that the JSON extension isn’t targeting your application. It’s not enough to just put "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)” on the resource, it must also go on the extension, meaning that you need to configure the Aries JAX-RS support to add that property.


The other suggested fix, as Oleg outlined, is for example:

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
    })
public class MyApp extends Application {
    @Reference(target="(osgi.jaxrs.name=jaxb-json)”)
    Object writer;
    
    @Override
    public Set<Object> getSingletons() {
        Feature f = fc -> fc.register(writer, MessageBodyWriter.class, MessageBodyReader.class);
        Set<Object> singletons = new HashSet<>();
        singletons.add(f);
        return singletons;
    }
}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
    })
public class MyService ...


On 15 Nov 2019, at 15:35, Oleg Cohen <[hidden email]> wrote:

Hi Matthias,

I was in the same situation. Here is what I ended up doing. Perhaps it will work for you.

Here is my code:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.apache.logging.log4j.Logger;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsApplicationBase;
import org.osgi.service.jaxrs.whiteboard.propertytypes.JaxrsName;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@Component(service = Application.class)
@JaxrsApplicationBase(my-app")
@JaxrsName(“MyApplication")
public class MyApplication extends Application {

private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(MyApplication.class);

private JacksonJsonProvider jsonProvider;

@Activate
private void activate() {

logger.info(“MyApplication.activate(): Entry ...");

ObjectMapper objectMapper = new ObjectMapper();

objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(Include.NON_NULL);

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

jsonProvider = new JacksonJsonProvider(objectMapper);

logger.info(“MyApplication.activate(): jsonProvider = " + jsonProvider);
}

    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();
        
        singletons.add(jsonProvider);

        return singletons;
    }
}


On Nov 15, 2019, at 10:26 AM, Matthias Leinweber <[hidden email]> wrote:

Ok that is something i already tried. But i don't want to use a own MessageWriter/Reader. I just want to use the one provided by aries-http whiteboard:
[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter]
----------------------------------------------------------------------
 jackson.jaxb.version = 2.9.6
 jackson.jaxrs.json.version = 2.9.6
 osgi.jaxrs.extension = true
 osgi.jaxrs.media.type = application/json
 osgi.jaxrs.name = jaxb-json
 service.bundleid = 46
 service.id = 170
 service.ranking = -2147483648
 service.scope = prototype
Provided by :
 Apache Aries JAX-RS JAX-RS Jackson (46)
Used by:
 Apache Aries JAX-RS Whiteboard (47)

But something is wrong...

My components are configured this way...

@Component(
    service = Application.class,
    property = {
      "osgi.jaxrs.name=MyApp",
      "osgi.jaxrs.application.base=/app",
      "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)",
      //"osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- i tried it also here
    })
public class MyApp extends Application {}

@Path("/service")
@Component(
    service = MyService.class,
    property = {
      "osgi.jaxrs.resource=true",
      "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)",
      "osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)" <- with this line the complete karaf installation is not responding
    })
public class MyService ...

Am Fr., 15. Nov. 2019 um 11:47 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias,

So it sounds as though you’re in the following situation:
  1. Providing a custom Application to the whiteboard
  2. The application service has the property osgi.jaxrs.name = MyApp set on the service registration
  3. Your application needs, but does not contain, JSON serialisation support
  4. You want to use an external MessageBodyReader and MessageBodyWriter service to extend your application

Assuming that these are correct then:

  1. Your Application needs to tell the whiteboard that it is missing some required extensions. This will prevent it being deployed until the extension is available. See the details of the osgi.jaxrs.extension.select property which will need to match service properties on your whiteboard extension
  2. Your external MessageBodyReader and MessageBodyWriter will need to be registered with
    1. The service has the property osgi.jaxrs.extension = true (to say that this is an extension)
    2. The service registers the interfaces MessageBodyReader and MessageBodyWriter (defining the types that the whiteboard will use it as)
    3. The service has the relevant property(ies) to match your application’s extension select filter
    4. The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name=MyApp) to select your application as a target

Another option is simply to set the extension as a part of your whiteboard application. This way you avoid the need to set quite so many service properties because the application is “complete” and doesn’t need to register a dependency or be targeted by an extension.

All the best,

Tim

On 15 Nov 2019, at 00:07, Matthias Leinweber <[hidden email]> wrote:

Ok i hit an additional problem.
When i create a JaxRsApplication i can reference them in my resource everything works fine except the MessageWriter and MessageReader e.g. Jackson Extension is not found.
--> No message body writer has been found for class ... ContentType: application/json
Without "osgi.jaxrs.application.select=(osgi.jaxrs.name=MyApp)", serialization works.

I also tried to explicitly select the whiteboard for the Application, with "osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)" but that doesn't work.
How does the injection mechanism work? I couldn't figure it out reading the aries source code.

regards,
Matthias

Am Fr., 8. Nov. 2019 um 10:28 Uhr schrieb Tim Ward <[hidden email]>:
Hi,

Yes, you can absolutely inject things using @Context (this is the only way to do server sent events, so it’s not optional for any implementation). It’s recommended that you inject into resource methods, rather than into fields, unless you make your service prototype scope. This is to avoid any potential threading mismatch if you inject invocation scoped objects (e.g. an incoming HttpServletRequest) and get two http calls at the same time.

Tim

On 7 Nov 2019, at 16:24, Matthias Leinweber <[hidden email]> wrote:

Great. Thank you very much.

I dont want to add CXF or Jersey. thank to your answer I have come up with the idea myself to inject the  @Context HttpServletRequest into the JaxRS code. To mix in this: https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e120961
I didn't test it yet but does it work? I don't see that the aries JaxRs whiteboard impl somewhere defined osgi.http.whiteboard.servlet.multipart.enabled=true

Best regards,
Matthias

Am Do., 7. Nov. 2019 um 15:38 Uhr schrieb Tim Ward <[hidden email]>:
Hi Matthias

I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.

I hope it’s now clear that the JAX-RS whiteboard does not support Servlets. You can either:
  • Register a servlet with the Http Whiteboard and find a place to put the file
  • Handle the multipart file upload using JAX-RS

If the file upload is only needed by your JAX-RS components then I would recommend just using JAX-RS rather than a servlet.

* So a JaxRsResource can but most not belong to an application?

A JAX-RS Whiteboard resource is just a “bare” resource in the service registry. In the most common case the resource service that you register will bind to the “default” application provided by the JAX-RS Whiteboard. There is no need to deploy a custom whiteboard application for resources to be hosted by the JAX-RS whiteboard.

* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

Yes. This will work fine. All the resources (by default) will get hosted in the default application. If you do want to provide some isolation between the resources (e.g. if you need differently configured JSON providers for different resources) then you can still do this with a single JAX-RSWhiteboard, but you will need to provide separate Applications for the resources and extensions. This is because applications within the whiteboard *are* isolated from each other, and can have different sets of resources and extensions.

In general, however, you’re pretty safe just registering all the resources and extensions that you need directly with the whiteboard using the default application.

All the best,

Tim


On 7 Nov 2019, at 12:54, Matthias Leinweber <[hidden email]> wrote:

Hello Tim,

thanks for your reply. I get the JaxRS Application thing wrong. I thought that an application and a JaxRsResource is/can be the same. But obviously, if you read the documentation correct, then not.
Then it also makes sense to inject the Application with @Context Applicaiton app into a method.
I had also a misunderstanding with http and jaxrs whiteboard. I was a bit confused about how you could add a Servelt to the JaxRsWhiteboard instead of the HttpWhiteboard for Multi-Part file uploads.
I think the default app and the configuration of the default jaxrs whiteboard caused some confusion for me.

* So a JaxRsResource can but most not belong to an application?
* It's fine to put all your Resources into the same JaxRsWhiteboard even if you could separate them?

right? then I think, I understood the thing and i like it :)

Best regards
Matthias

Am Do., 7. Nov. 2019 um 13:24 Uhr schrieb Tim Ward <[hidden email]>:
in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

If you want to register an application with the whiteboard then you must register it as a javax.ws.rs.core.Application in the service registry. This is outlined at https://osgi.org/specification/osgi.cmpou cann/7.0.0/service.jaxrs.html#service.jaxrs.application.services

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

I’m not sure that I totally follow here. It looks like you’re trying to create a configuration for another Aries JAX-RS whitboard instance - is this really what you want, a second JAX-RS whiteboard? The Aries JAX-RS Whiteboard is designed to build on top of a compliant Http Whiteboard, if you are actually trying to create another Http Whiteboard (e.g. to get HTTP served on another port) then you will need to set that up in PAX-Web.

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

This property only applies if you create more than one JAX-RS whiteboard, and would be applied to your JAX-RS Whiteboard services (resources, applications, extensions), and you would use the filter to select the JAX-RS Whiteboard that you wanted them to use. If you do want to do this, which seems unlikely, then you would typically add a marker property into the configuration for your JAX-RS Whiteboard and then use that property name/value in the filter.


Any questions that relate to setting up the Http Whiteboard will need to be handled by someone with more PAX-Web experience. I would also recommend that, in addition to describing the problems that you’ve encountered, you include a description of what you’re trying to achieve with your system.

E.g.

  • Do you want multiple Http ports being served (this would be Http Whiteboard not JAX-RS Whiteboard)?
  • Do you want JAX-RS Whiteboard support on top of one or more of the available Http Whiteboards)?
  • Do you want to publish JAX-RS resource services, application services, or a mixture of the two?
  • Do you want the JAX-RS services that you publish to appear on all whiteboards, or just a subset?

With this information it will be much easier to help you to achieve your goal.

All the best,

Tim

On 6 Nov 2019, at 17:25, Matthias Leinweber <[hidden email]> wrote:

Hi JB,
yes that was my first place to start... really like the examples in the source, they are really helpful.

ok:
Fist thing are JAXRs Applications. In OSGI7 we will use
@JaxrsName("myApp")
@JaxrsApplicationBase("foo")
@Component
class....

in OSGI 6 I think we should be able to use
@Component(property = {"osgi.jaxrs.name=myApp", "osgi.jaxrs.application.base=/foo"}, service = A.class)
class...
That does not work or did I misunderstood something?

Second how do i create additional Servlets and how do I select them in a resource?
E.g. A configfile/servicepid
org.apache.aries.jax.rs.whiteboard-bar.cfg
application.base.prefix=/bar
should create an additional servlet container?

Then with
@JaxrsWhiteboardTarget
or
"osgi.jaxrs.whiteboard.target="

I can select the servlet/Whiteboard, but how does the LDAP string look? 
(service.pid=org.apache.aries.jax.rs.whiteboard-bar)?

Best regards,
Matthias


Am Mi., 6. Nov. 2019 um 18:00 Uhr schrieb Jean-Baptiste Onofré <[hidden email]>:
Hi Matthias,

did you take a look on the Karaf example ?

https://github.com/apache/karaf/tree/master/examples/karaf-rest-example

It contains different approaches, including whiteboard.

Can you describe a bit what you are looking for ? We can then create the
Jira at Karaf/Aries to improve example/documentation.

Regards
JB

On 06/11/2019 17:56, Matthias Leinweber wrote:
> Hello Karaf Team,
>
> I know that this not the 100% correct mailing list for aries jax-rs.
> However my question is what do you plan for further releases of Karaf? I
> try to use the aries implementation but I struggle with the configuration.
> Beside the incomplete documentation and the "very special" DSL which is
> used I dug into the code and understood the following things.
>
> * You can not add additional JAXRSApplications. ("osgi.jaxrs.name
> <http://osgi.jaxrs.name>=myApp", "osgi.jaxrs.application.base=/approot"}
> although there is code which should do this?
> * Additional configurations for other then the default servlet is not
> possible although there is a service factory manager which should handle
> additional configs?
> * With org.apache.aries.jax.rs.whiteboard.default.cfg
> # application.base.prefix you can add a global url prefix to your
> JaxRSResoureces. Would be nice if that could be documented somewhere.
>
> Don't get me wrong I do not say that the bundle is bad, but at some
> point it could be easier to understand.
>
> regards Matthias
>
>

--
Jean-Baptiste Onofré
[hidden email]
http://blog.nanthrax.net
Talend - http://www.talend.com


--