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 <http://osgi.jaxrs.name/> = jaxb-json > service.bundleid = 46 > service.id <http://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 <http://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 > <http://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 > <http://osgi.jaxrs.name/>=MyApp)", > "osgi.jaxrs.extension.select=(osgi.jaxrs.name > <http://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 > <mailto:tim.w...@paremus.com>>: > Hi Matthias, > > So it sounds as though you’re in the following situation: > Providing a custom Application to the whiteboard > The application service has the property osgi.jaxrs.name > <http://osgi.jaxrs.name/> = MyApp set on the service registration > Your application needs, but does not contain, JSON serialisation support > You want to use an external MessageBodyReader and MessageBodyWriter service > to extend your application > > Assuming that these are correct then: > > 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 > Your external MessageBodyReader and MessageBodyWriter will need to be > registered with > The service has the property osgi.jaxrs.extension = true (to say that this is > an extension) > The service registers the interfaces MessageBodyReader and MessageBodyWriter > (defining the types that the whiteboard will use it as) > The service has the relevant property(ies) to match your application’s > extension select filter > The service has the property osgi.jaxrs.application.select = (osgi.jaxrs.name > <http://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 >> <mailto: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 >> <http://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 >> <mailto: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 >>> <mailto: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 >>> >>> <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 >>> <mailto: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 >>>> <mailto: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 >>>> <mailto:tim.w...@paremus.com>>: >>>>> 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 <m.leinwe...@datatactics.de >>>>> <mailto: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 <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é >>>>> <j...@nanthrax.net <mailto: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 >>>>> <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é >>>>> jbono...@apache.org <mailto:jbono...@apache.org> >>>>> http://blog.nanthrax.net <http://blog.nanthrax.net/> >>>>> Talend - http://www.talend.com <http://www.talend.com/> >>>>> >>>>> >>>>> -- >>>> >>>> >>>> >>>> >>> >>> >>> >>> >> >> >> > > > >