Well, it is not possible to register more than one service using DOSGi using the same "org.apache.cxf.rs.httpservice.context". I updated CXF to 2.7.4 and DOSGi to 1.4.0 and now I'm using "org.apache.cxf.rs.httpservice.context" property with full relative address and "org.apache.cxf.rs.address" "/" in all my services. With this configuration, all the endpoint are correctly deployed and are accessible, including WADLs.
Thank you for your assistance, Sergey!! On 2 May 2013 13:22, Julio Carlos Barrera Juez < [email protected]> wrote: > Is there any way to publish my REST API not using > "org.apache.cxf.rs.httpservice.context" property and using different > "org.apache.cxf.rs.address" relative paths property with DOSGi? When I used > absolute paths it worked, now I need to use HTTP service and it is > a nightmare achieving same goal. > > > > On 2 May 2013 12:11, Julio Carlos Barrera Juez < > [email protected]> wrote: > >> As I mentioned a few times, if I register two services with the same >> "org.apache.cxf.rs.httpservice.context" property with value like "/myApp" I >> get an error: >> >> Exception in thread "pool-12-thread-4" >> org.osgi.framework.ServiceException: CXF DOSGi: problem registering CXF >> HTTP Servlet >> at >> org.apache.cxf.dosgi.dsw.handlers.HttpServiceConfigurationTypeHandler.registerServletAndGetBus(HttpServiceConfigurationTypeHandler.java:200) >> at >> org.apache.cxf.dosgi.dsw.handlers.JaxRSHttpServiceConfigurationTypeHandler.createServer(JaxRSHttpServiceConfigurationTypeHandler.java:55) >> at >> org.apache.cxf.dosgi.dsw.service.RemoteServiceAdminCore.exportService(RemoteServiceAdminCore.java:247) >> at >> org.apache.cxf.dosgi.dsw.service.RemoteServiceAdminInstance$1.run(RemoteServiceAdminInstance.java:72) >> at >> org.apache.cxf.dosgi.dsw.service.RemoteServiceAdminInstance$1.run(RemoteServiceAdminInstance.java:67) >> at java.security.AccessController.doPrivileged(Native Method) >> at >> org.apache.cxf.dosgi.dsw.service.RemoteServiceAdminInstance.exportService(RemoteServiceAdminInstance.java:66) >> at >> org.apache.cxf.dosgi.dsw.service.RemoteServiceAdminInstance.exportService(RemoteServiceAdminInstance.java:38) >> at >> org.apache.cxf.dosgi.topologymanager.TopologyManager$2.run(TopologyManager.java:267) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) >> at java.lang.Thread.run(Thread.java:662) >> Caused by: org.osgi.service.http.NamespaceException: alias is already in >> use in this or another context >> at >> org.ops4j.pax.web.service.spi.model.ServerModel.addServletModel(ServerModel.java:120) >> at >> org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:139) >> at >> org.ops4j.pax.web.service.internal.HttpServiceProxy.registerServlet(HttpServiceProxy.java:56) >> at >> org.apache.cxf.dosgi.dsw.handlers.HttpServiceConfigurationTypeHandler.registerServletAndGetBus(HttpServiceConfigurationTypeHandler.java:194) >> ... 11 more >> >> Moreover, the endpoint registered loses his portion of path corresponding >> to "org.apache.cxf.rs.address" property. It means that my desired URL >> "/myApp/serviceA/methodY" is transformed to "/myApp/methodY". >> >> And the mixing of services is produced anyway, if I look for serviceA >> WADL ("myApp/serviceA?_wadl") I get exactly the same as if I look for >> serviceB WADL ("myApp/serviceB?_wadl"). Same addresses referring to >> serviceB in both cases. >> >> >> On 2 May 2013 11:57, Sergey Beryozkin <[email protected]> wrote: >> >>> On 02/05/13 10:52, Julio Carlos Barrera Juez wrote: >>> >>>> What fix? Is there any bug in version 1.3? I am going to try changing >>>> the >>>> version, but what now? Do need I to use both properties? How to achieve >>>> having an URL like "/myApp/serviceX/methodY" >>>> >>> >>> yes, ex, "/myApp" for the the context property and "/serviceX/methodY" >>> for the rs.address property will give you that combined relative path >>> >>> Sergey >>> >>> >>> >>>> >>>> On 2 May 2013 11:39, Sergey Beryozkin<[email protected]**> wrote: >>>> >>>> On 02/05/13 10:34, Julio Carlos Barrera Juez wrote: >>>>> >>>>> I am using DOSGI 1.3 with bundles cxf-dosgi-ri-discovery-local and >>>>>> cxf-dosgi-ri-dsw-cxf. And CXF 2.4.3. It is difficult to choose a >>>>>> different >>>>>> version, because we use a concrete Servicemix version (4.4.1), quite >>>>>> old, >>>>>> we know :-( . >>>>>> >>>>>> >>>>> The fix I was referring to (and which I hope but can not guarantee at >>>>> the >>>>> moment will help in your case) is in DOSGi 1.4. Can you experiment with >>>>> DOSGi 1.4 multibundle distro ? >>>>> >>>>> Sergey >>>>> >>>>> >>>>> >>>>>> On 2 May 2013 11:28, Sergey Beryozkin<[email protected]****> >>>>>> wrote: >>>>>> >>>>>> What DOSGi version do you use ? >>>>>> >>>>>>> Sergey >>>>>>> >>>>>>> On 02/05/13 10:22, Julio Carlos Barrera Juez wrote: >>>>>>> >>>>>>> As I wrote in my first e-mail, If we use the same value for " >>>>>>> >>>>>>>> org.apache.cxf.rs.********httpservice.context" in each bundle, we >>>>>>>> get >>>>>>>> >>>>>>>> errors >>>>>>>> >>>>>>>> noticing it. And if we use different values in "org.apache.cxf.rs.** >>>>>>>> >>>>>>>> httpservice.context" property and "org.apache.cxf.rs.address" there >>>>>>>> is a >>>>>>>> mix in the WADLs and in the WS registrations. Each WADL point to the >>>>>>>> last >>>>>>>> registered service. We have tried all the combinations of values of >>>>>>>> both >>>>>>>> properties and none of them give us a good result ;-(( >>>>>>>> >>>>>>>> >>>>>>>> On 2 May 2013 11:01, Sergey Beryozkin<[email protected]******> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hi >>>>>>>> >>>>>>>> >>>>>>>>> On 02/05/13 09:10, Julio Carlos Barrera Juez wrote: >>>>>>>>> >>>>>>>>> Additionally, we cannot provide good javax.ws.rs.Path >>>>>>>>> annotations >>>>>>>>> >>>>>>>>> because >>>>>>>>>> our OSGi service interfaces are used to generate different >>>>>>>>>> services dynamically. for instance, given this interface: >>>>>>>>>> >>>>>>>>>> @Path("/") >>>>>>>>>> public interface DynamicService { >>>>>>>>>> >>>>>>>>>> @Path("/methodA") >>>>>>>>>> public Object methodA(); >>>>>>>>>> >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> Different services are registered using the same interface, then >>>>>>>>>> different "org.apache.cxf.rs.address" >>>>>>>>>> properties are generated to differentiate each service like >>>>>>>>>> "/serviceA" >>>>>>>>>> and >>>>>>>>>> "/serviceB". Both services have same interface, but different >>>>>>>>>> instances. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> What I know is possible with DOSGi CXF 1.4 is to use both >>>>>>>>>> >>>>>>>>>> "org.apache.cxf.rs.********httpservice.context" and >>>>>>>>> >>>>>>>>> >>>>>>>>> "org.apache.cxf.rs.address" >>>>>>>>> >>>>>>>>> properties, both being relative, example, see >>>>>>>>> >>>>>>>>> http://svn.apache.org/repos/********asf/cxf/dosgi/tags/cxf-**** >>>>>>>>> dosgi-****<http://svn.apache.org/repos/******asf/cxf/dosgi/tags/cxf-**dosgi-****> >>>>>>>>> <http://svn.apache.**org/repos/****asf/cxf/dosgi/** >>>>>>>>> tags/cxf-dosgi-****<http://svn.apache.org/repos/****asf/cxf/dosgi/tags/cxf-dosgi-****> >>>>>>>>> > >>>>>>>>> <http://svn.apache.**org/**repos/**asf/cxf/dosgi/**tags/** >>>>>>>>> cxf-dosgi-**<http://svn.**apache.org/repos/**asf/cxf/** >>>>>>>>> dosgi/tags/cxf-dosgi-**<http://svn.apache.org/repos/**asf/cxf/dosgi/tags/cxf-dosgi-**> >>>>>>>>> > >>>>>>>>> >>>>>>>>>> >>>>>>>>>> ri-1.4.0/samples/greeter_rest/********impl2/src/main/java/org/** >>>>>>>>> ** >>>>>>>>> apache/cxf/dosgi/samples/********greeter/impl2/rest/Activator.** >>>>>>>>> *** >>>>>>>>> ***java< >>>>>>>>> http://svn.apache.org/**repos/****asf/cxf/dosgi/tags/cxf-**<http://svn.apache.org/**repos/**asf/cxf/dosgi/tags/cxf-**> >>>>>>>>> <ht**tp://svn.apache.org/**repos/**asf/cxf/dosgi/tags/cxf-**<http://svn.apache.org/**repos/asf/cxf/dosgi/tags/cxf-**> >>>>>>>>> > >>>>>>>>> dosgi-ri-1.4.0/samples/******greeter_rest/impl2/src/main/** >>>>>>>>> java/org/apache/cxf/dosgi/******samples/greeter/impl2/rest/****** >>>>>>>>> Activator.java<http://svn.**ap**ache.org/repos/asf/cxf/**<http://apache.org/repos/asf/cxf/**> >>>>>>>>> dosgi/tags/cxf-dosgi-ri-1.4.0/****samples/greeter_rest/impl2/**** >>>>>>>>> src/main/java/org/apache/cxf/****dosgi/samples/greeter/impl2/**** >>>>>>>>> rest/Activator.java<http://**svn.apache.org/repos/asf/cxf/** >>>>>>>>> dosgi/tags/cxf-dosgi-ri-1.4.0/**samples/greeter_rest/impl2/** >>>>>>>>> src/main/java/org/apache/cxf/**dosgi/samples/greeter/impl2/** >>>>>>>>> rest/Activator.java<http://svn.apache.org/repos/asf/cxf/dosgi/tags/cxf-dosgi-ri-1.4.0/samples/greeter_rest/impl2/src/main/java/org/apache/cxf/dosgi/samples/greeter/impl2/rest/Activator.java> >>>>>>>>> > >>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> So you should be able to set "org.apache.cxf.rs.****** >>>>>>>>> >>>>>>>>> httpservice.context" >>>>>>>>> >>>>>>>>> to >>>>>>>>> >>>>>>>>> say "/rest" for all the bundles and "/a", "/b", etc for >>>>>>>>> "org.apache.cxf.rs.address" for the individual bundles. >>>>>>>>> Give that a try please. >>>>>>>>> >>>>>>>>> One other thing is that you can avoid annotating interfaces with >>>>>>>>> JAX-RS >>>>>>>>> annotations and use the external user models, the greeter_rest demo >>>>>>>>> shows >>>>>>>>> that too. The only limitation there is that a user model is >>>>>>>>> static, one >>>>>>>>> can >>>>>>>>> not 'attach' them dynamically, may be we should support that... >>>>>>>>> >>>>>>>>> Sergey >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On 2 May 2013 09:24, Julio Carlos Barrera Juez< >>>>>>>>> >>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>> Hi! >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> We have a ServiceMix app with multiple bundles. We want to >>>>>>>>>>> export our >>>>>>>>>>> OSGi >>>>>>>>>>> service interfaces using DOSGi. We annotate our service >>>>>>>>>>> interfaces >>>>>>>>>>> with javax.ws.rs.Path, javax.ws.rs.GET, >>>>>>>>>>> javax.ws.rs.POST, javax.ws.rs.Consumes and javax.ws.rs.Produces. >>>>>>>>>>> Then >>>>>>>>>>> we >>>>>>>>>>> register our OSGi services using Apache Aries Blueprint or Java >>>>>>>>>>> code >>>>>>>>>>> adding different CXF properties. >>>>>>>>>>> >>>>>>>>>>> At the beginning we used "org.apache.cxf.rs.address" property >>>>>>>>>>> with >>>>>>>>>>> absolute URLs, using Jetty standalone instance. But now we want >>>>>>>>>>> to >>>>>>>>>>> use >>>>>>>>>>> relative address to use HTTP service. If we don't >>>>>>>>>>> specify "org.apache.cxf.rs.********httpservice.context" >>>>>>>>>>> property, our >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> service >>>>>>>>>>> >>>>>>>>>>> seems >>>>>>>>>>> to be not registered at all. I we specify this property with same >>>>>>>>>>> value >>>>>>>>>>> for >>>>>>>>>>> all services there are some errors when registering services >>>>>>>>>>> ("alias >>>>>>>>>>> in >>>>>>>>>>> use >>>>>>>>>>> or another context..."). If we specify different values for each >>>>>>>>>>> registration there are no errors, but there are a mix of methods >>>>>>>>>>> in >>>>>>>>>>> each >>>>>>>>>>> service (looking at WADL). >>>>>>>>>>> >>>>>>>>>>> How we must set both properties to achieve having different >>>>>>>>>>> services >>>>>>>>>>> registered with relative paths? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>> >>>>>>>>> Sergey Beryozkin >>>>>>>>> >>>>>>>>> Talend Community Coders >>>>>>>>> http://coders.talend.com/ >>>>>>>>> >>>>>>>>> Blog: http://sberyozkin.blogspot.com >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> -- >>>>>>> Sergey Beryozkin >>>>>>> >>>>>>> Talend Community Coders >>>>>>> http://coders.talend.com/ >>>>>>> >>>>>>> Blog: http://sberyozkin.blogspot.com >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> -- >>>>> Sergey Beryozkin >>>>> >>>>> Talend Community Coders >>>>> http://coders.talend.com/ >>>>> >>>>> Blog: http://sberyozkin.blogspot.com >>>>> >>>>> >>>> >>> >>> -- >>> Sergey Beryozkin >>> >>> Talend Community Coders >>> http://coders.talend.com/ >>> >>> Blog: http://sberyozkin.blogspot.com >>> >> >> >
