And thanks Carlos for the help as well ;)

Regards
JB

On 15/10/2019 17:04, Jean-Baptiste Onofré wrote:
> 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

Reply via email to