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 <[email protected]>: > 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 > <https://osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/jaxrs/whiteboard/JaxrsWhiteboardConstants.html#JAX_RS_APPLICATION_SELECT> > 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. > > https://builds.apache.org/job/Aries-JAX-RS-Whiteboard-Integrations/ > > I see releases 1.0.0 to 1.0.2 in Maven Central, all of them with source > jars. > > > https://mvnrepository.com/artifact/org.apache.aries.jax.rs/org.apache.aries.jax.rs.jackson > > I hope this helps, all the best, > > Tim > > On 17 Nov 2019, at 17:27, Matthias Leinweber <[email protected]> > 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 <[email protected]> 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 <[email protected]> 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 < >> [email protected]> 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 <[email protected] >> >: >> >>> 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 <[email protected]> >>> 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 <[email protected] >>> >: >>> >>>> 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 <[email protected]> >>>> 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 < >>>> [email protected]>: >>>> >>>>> 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 < >>>>> [email protected]> 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 < >>>>> [email protected]>: >>>>> >>>>>> 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 < >>>>>> [email protected]> 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é < >>>>>> [email protected]>: >>>>>> >>>>>>> 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é >>>>>>> [email protected] >>>>>>> http://blog.nanthrax.net >>>>>>> Talend - http://www.talend.com >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >>> >>> >>> >> >> >> >> >> >
