Hi Martin, all, after a longer break I got back to this topic and finally managed to achieve most of my goals. However, I'm somehow stuck with what might be a trivial problem if you know what to look for. I publish a JAX-RS service using the CXFNonSpringJaxRsServlet (see [1]) that returns an JAXB annotated Bean when being called with GET. This works fine for XML but not for JSON. So if I run
curl -v -H "Accept: application/xml" http://localhost:8080/rest/v2.0/ I'll get this as result: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><demoDto><name>myName</name></demoDto> But if I run curl -v -H "Accept: application/json" http://localhost:8080/rest/v2.0/ I get No message body writer has been found for response class DemoDto. As you can see in [1] I tried to configure JSONProvider in separate ways. I also tried to create the Servlet completely different, using JAXRSServerFactoryBean method (see https://gist.github.com/danbim/5207449). While this also worked in principle, it also failed to serialize to JSON with the same error message. Does somebody know what I'm doing wrong? Cheers, Daniel [1] https://github.com/itm/service-publisher/blob/master/cxf/src/main/java/de/uniluebeck/itm/servicepublisher/cxf/ServicePublisherJaxRsService.java#L49 On 07.01.2013, at 16:26, Martin Fernau wrote: > Hmm, then I have no further idea. > My program is completely controlled via code. I don't use any kind of > config file and Endpoint.publish doesn't start a new jetty-instance for me. > This way I start my jetty-server (8.0.3) and publish my services and > Apache CXF (2.4.2) to it: > > --- cut > Server server = new Server(); > ArrayList<Connector> connectors = new ArrayList<Connector>(); > > // for each ServerPort your Server should listen to > SelectChannelConnector connector = new SelectChannelConnector(); > connector.setPort(p); > connectors.add(connector); > > // telling jetty to listen the following ports > server.setConnectors(connectors.toArray(new Connector[]{})); > > // Creating the ServletContextHandler > ServletContextHandler servletContext = new > ServletContextHandler(ServletContextHandler.SESSIONS); > servletContext.setContextPath("/"); > > ContextHandlerCollection contexts = new ContextHandlerCollection(); > contexts.setHandlers(new Handler[] { servletContext }); > > server.setHandler(contexts); > > // Adding my CXFServlet > ServletHolder sh = new ServletHolder(new CXFServlet(this)); > servletContext.getServletHandler().addServletWithMapping(sh, "/services/*"); > > // Adding all further Servlets like the CXF-Servlet above > > // Start Jetty > server.start(); > --- cut > > AFAIK, if you start jetty, you can't add further servlets during runtime > in this way. I don't know _when_ you call Endpoint.publish in your code. > For me this all happens on startup of my system and after I start the > jetty server with "server.start();" I don't call Endpoint.publish any more. > > Regards > Martin > > > Am 07.01.2013 15:31, schrieb Daniel Bimschas: >> No, no. I also use javax.xml.ws.Endpoint. But as CXF is extending the >> javax.xml.ws.spi.Provider class in org.apache.cxf.jaxws.spi.ProviderImpl >> calling Endpoint.publish() results in a call of >> org.apache.cxf.jaxws.EndpointImpl.doPublish(). >> >> On 07.01.2013, at 15:20, Martin Fernau wrote: >> >>> Hm - for me it's not "org.apache.cxf.jaxws.EndpointImpl". I use >>> "javax.xml.ws.Endpoint" in my loadBus Method. Maybe this is your problem. >>> >>> HTH >>> Martin >>> >>> Am 07.01.2013 13:44, schrieb Daniel Bimschas: >>>> I keep running into the same problem. >>>> org.apache.cxf.jaxws.EndpointImpl.doPublish(...) still tries to start a >>>> new Jetty instance. Also I can't find any setter or similar functionality >>>> to pass an existing instance to EndpointImpl... >>>> >>>> On 07.01.2013, at 13:31, Daniel Bimschas wrote: >>>> >>>>> Forget the question! Got it now that this is just your use/test case >>>>> having this DefaultHTTPServerEngine ;-) I'll try with the snippet... >>>>> >>>>> On 07.01.2013, at 13:16, Daniel Bimschas wrote: >>>>> >>>>>> 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. >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >>> >>> -- >>> 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. >>> >>> >> >
