Martin,

that looks like exactly what I'm looking for! Unfortunately there seems to be 
no class called DefaultHTTPServerEngine. Is this code snippet up to date with 
the current release (I'm using 2.7.1)?

Cheers,
Daniel

On 07.01.2013, at 13:05, Martin Fernau wrote:

> Hi Daniel,
> 
> programmatically adding a WS-Endpoint was a bit more tricky. For this to
> work I did the follwoing:
> I write a CXFServlet-Class extending from CXFNonSpringServlet like this:
> 
> --- cut
> public class CXFServlet extends CXFNonSpringServlet {
>       private Logger logger = Logger.getLogger(CXFServlet.class);
>       private DefaultHTTPServerEngine httpServerEngine;
>       
>       public CXFServlet(DefaultHTTPServerEngine httpServerEngine) {
>               super();
>               this.httpServerEngine = httpServerEngine;
>       }
>       
>       @Override
>       public void loadBus(ServletConfig servletConfig) {
>               super.loadBus(servletConfig);
>               logger.info("Loading CXF servlet...");
>               BusFactory.setDefaultBus(this.getBus());
>               
>               Set<String> endpoints = 
> httpServerEngine.getJaxServices().keySet();
>               for (String endpoint : endpoints) {
>                       Endpoint.publish(endpoint,
> httpServerEngine.getJaxServices().get(endpoint));                             
>               }
>       }
> }
> --- cut
> 
> This CXFServlet I add like this:
> 
> --- cut
> CXFServlet servlet = new CXFServlet(httpServerEngine), "/services/*";
> ServletHolder sh = new ServletHolder(servlet);
>               servletContext.getServletHandler().addServletWithMapping(sh, 
> servletPath);
> --- cut
> 
> The "loadBus" method from my CXFServlet gets called automatically from
> CXF somewhen. Within this method I just use the reference to my
> DefaultHTTPServerEngine Object to obtain a list of my WS-Objects I want
> to add to my system. Theoretically you just add all WS-Objects in this
> method like this:
> 
> --- cut
> Endpoint.publish("myService", objectOfClassImplementingWSInterface);
> --- cut
> 
> You need to know that the endpoint "myService" is relative to the path I
> used to add my CXFServlet in jetty. As I used "/services/*" for this
> path in Jetty, the real path for Endpoint.publish("myService", ...)" is
> "/services/myService".
> 
> HTH
> Martin
> 
> 
> Am 07.01.2013 11:31, schrieb Daniel Bimschas:
>> Hi Martin,
>> 
>> thank you for this answer. I actually already did this myself and it works 
>> fine for adding a normal servlet. But when I add an JAX-RS application using 
>> JAXRSServerFactoryBean (or a JAX-WS endpoint using Endpoint.publish(...)) it 
>> tries to start another Jetty instance on the same port :-(.
>> 
>> It is pretty obvious to me that a "ServerFactory" creates a new Jetty 
>> instance. However, I did not find another way yet to programmatically add a 
>> JAX-WS/JAX-RS service instance to the root context.
>> 
>> https://gist.github.com/4473947 shows how I construct my server instance.
>> 
>> So, to me it seems that I have to let the CXF framework know of the 
>> existence of the Jetty instance. Does somebody have an idea?
>> 
>> Best,
>> Daniel
>> 
>> On 05.01.2013, at 19:02, Martin Fernau wrote:
>> 
>>> Not sure if there is a way to do this with CXF - but I do it with jetty 
>>> itself:
>>> 
>>> servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
>>> servletContext.setContextPath("/");
>>> ContextHandlerCollection contexts = new ContextHandlerCollection();
>>> contexts.setHandlers(new Handler[] { securityHandler, servletContext, 
>>> webAppContext });
>>> // Regiser on server
>>> server.setHandler(contexts);
>>> // For each servlet you want to add do this
>>> ServletHolder sh = new ServletHolder(servlet);
>>> String servletPath = "/some/where";
>>> servletContext.getServletHandler().addServletWithMapping(sh, servletPath);
>>> 
>>> Regards
>>> Martin
>>> 
>>> 
>>> Am 05.01.2013 17:47, schrieb Daniel Bimschas:
>>>> Hi list,
>>>> 
>>>> Is there a way with CXF to programmatically add a good old HttpServlet 
>>>> instance to an already running instance of the embedded Jetty container?
>>>> 
>>>> This way I would be able to add a WebSocketServlet to Jetty...
>>>> 
>>>> Best regards,
>>>> Daniel
>>> 
>>> 
>>> -- 
>>> FERNAUSOFT GmbH
>>> Gartenstraße 42 - 37269 Eschwege
>>> 
>>> Telefon (0 56 51) 95 99-0
>>> Telefax (0 56 51) 95 99-90
>>> 
>>> eMail [email protected]
>>> Internet http://www.fernausoft.de
>>> 
>>> Handelsregister Eschwege, HRB 1585
>>> Geschäftsführer: Axel Fernau, Ulrich Fernau, Martin Fernau
>>> Steuernummer 025 233 00041
>>> USt-ID-Nr. DE 178 554 522
>>> 
>>> Diese E-Mail und alle beigefügten Dateien sind vertraulich und nur für den 
>>> Adressaten bestimmt.
>>> Wenn Sie nicht der richtige Adressat sind, leiten Sie diese E-Mail bitte 
>>> nicht weiter, öffnen Sie etwaige Anhänge nicht, machen Sie keine Kopien und 
>>> speichern Sie diese E-Mail nicht. Informieren Sie uns bitte, indem Sie uns 
>>> eine Antwort-Mail senden oder uns telefonisch unter +49 (0)5651 9599-0 
>>> verständigen. Löschen Sie bitte anschließend die erhaltene E-Mail aus Ihrem 
>>> System.
>>> Vielen Dank!
>>> 
>>> This email is only intended for the addressee. The content of this email, 
>>> including all attachments is confidential and includes privileged material.
>>> If you are not the intended recipient, please do not forward or disclose 
>>> this email, do not open any attachments or make copies or save this email 
>>> anywhere. Please inform us about the error by returning this email or by 
>>> calling us on our phone +49 (0)5651 9599-0. Please then finally delete this 
>>> email from your system.
>>> Thank you very much.
>>> 
>> 
> 
> 
> -- 
> FERNAUSOFT GmbH
> Gartenstraße 42 - 37269 Eschwege
> 
> Telefon (0 56 51) 95 99-0
> Telefax (0 56 51) 95 99-90
> 
> eMail [email protected]
> Internet http://www.fernausoft.de
> 
> Handelsregister Eschwege, HRB 1585
> Geschäftsführer: Axel Fernau, Ulrich Fernau, Martin Fernau
> Steuernummer 025 233 00041
> USt-ID-Nr. DE 178 554 622
> 
> Diese E-Mail und alle beigefügten Dateien sind vertraulich und nur für
> den Adressaten bestimmt.
> Wenn Sie nicht der richtige Adressat sind, leiten Sie diese E-Mail bitte
> nicht weiter, öffnen Sie etwaige Anhänge nicht, machen Sie keine Kopien
> und speichern Sie diese E-Mail nicht. Informieren Sie uns bitte, indem
> Sie uns eine Antwort-Mail senden oder uns telefonisch unter +49 (0)5651
> 9599-0 verständigen. Löschen Sie bitte anschließend die erhaltene E-Mail
> aus Ihrem System.
> Vielen Dank!
> 
> This email is only intended for the addressee. The content of this
> email, including all attachments is confidential and includes privileged
> material.
> If you are not the intended recipient, please do not forward or disclose
> this email, do not open any attachments or make copies or save this
> email anywhere. Please inform us about the error by returning this email
> or by calling us on our phone +49 (0)5651 9599-0. Please then finally
> delete this email from your system.
> Thank you very much.
> 
> 

Reply via email to