Hi, Thanks Dan, he found a way to fix the issue.
The servlet constructor has been changed to: public MyServlet(MyRestApi restApi, DestinationRegistry destinationRegistry, Bus bus) { super(destinationRegistry, false); this.restApi = restApi; this.setBus(bus); } and the bean registering the servlet has been changed to: MyRestApi restApi = new MyRestApi(); Map<Class<?>, Object> extensions = new HashMap<>(); DestinationRegistry destinationRegistry = new DestinationRegistryImpl(); HTTPTransportFactory httpTransportFactory = new HTTPTransportFactory(destinationRegistry); extensions.put(HTTPTransportFactory.class, httpTransportFactory); extensions.put(DestinationRegistry.class, destinationRegistry); Bus bus = new ExtensionManagerBus(extensions, null, getClass().getClassLoader()); org.apache.cxf.transport.DestinationFactoryManager destinationFactoryManager = bus.getExtension(org.apache.cxf.transport.DestinationFactoryManager.class); for (String url : HTTPTransportFactory.DEFAULT_NAMESPACES) { destinationFactoryManager.registerDestinationFactory(url, httpTransportFactory); } MyServlet restServlet = new MyServlet(restApi, destinationRegistry, bus); Thanks to that, I'm able to register several servlets each "isolated" with JAXRS Server. I think there are couple of bugs in CXF here. For instance, the setExtension(null, HTTPTransportFactory.class) to remove the default one should work, but the default is still in there. I will propose a PR to improve this. Regards JB On 15/10/2019 07:44, Jean-Baptiste Onofré wrote: > Hi, > > I have extended CXFNonSpringServlet two times: > > public class MyServlet1 extends CXFNonSpringServlet { > > @Override > public void init(ServletConfig config) throws ServletException { > super.init(config); > JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean(); > bean.setAddress("/"); > bean.setBus(getBus()); > bean.setProvider(new JacksonJsonProvider()); > bean.setServiceBean(new MyApi()); > bean.create(); > } > > } > > same with MyServlet2. > > MyServlet1 has /myservlet1 as alias, MyServlet2 has /myservlet2. > Note that I would like to use "/" for JAXRS server address as it's based > directly on the servlet alias (context). > > When I start the first servlet (let say MyServlet1), it's OK. However > when I start the second one (let say MyServlet2, but the same happens if > I start MyServlet2 first and MyServlet1), it fails with: > > Caused by: org.apache.cxf.service.factory.ServiceConstructionException: > There is an endpoint already running on /. > at > org.apache.cxf.jaxrs.JAXRSBindingFactory.addListener(JAXRSBindingFactory.java:86) > ~[?:?] > at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:128) > ~[?:?] > at > org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:209) > ~[?:?] > > So, even if I use two different servlets, it seems CXF has a shared > resource somewhere. > > Obviously if I have different address for JAXRS server it works, but > it's not that I want as I'm using two different servlets. > > I tried: > - to create a bus dedicated in each servlet > - to create a destination registry in each servlet > but it doesn't help. > > So, basically, my question is: is there a way to have completely > isolated CXFNonSpringServlet ? > > I gonna dig into CXF code today but if you already have some ideas, it > would be great. > > Thanks ! > Regards > JB > -- Jean-Baptiste Onofré jbono...@apache.org http://blog.nanthrax.net Talend - http://www.talend.com