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 < oleg.co...@assurebridge.com>: > 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 < > m.leinwe...@datatactics.de> 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 <tim.w...@paremus.com > >: > >> 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 >> >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#service.jaxrs.common.properties> >> 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 <m.leinwe...@datatactics.de> >> 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 <tim.w...@paremus.com >> >: >> >>> 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 <m.leinwe...@datatactics.de> >>> 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 <tim.w...@paremus.com >>> >: >>> >>>> 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 <m.leinwe...@datatactics.de> >>>> 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 < >>>> tim.w...@paremus.com>: >>>> >>>>> 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 >>>>> <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 < >>>>> m.leinwe...@datatactics.de> 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é < >>>>> j...@nanthrax.net>: >>>>> >>>>>> 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é >>>>>> jbono...@apache.org >>>>>> http://blog.nanthrax.net >>>>>> Talend - http://www.talend.com >>>>>> >>>>> >>>>> >>>>> -- >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> >> >> >> > > > >