Whooohoo! That exactly did the trick! Thank you so much for saving me even more 
unproductive hours of guessing!

Cheers,
Daniel

On 20.03.2013, at 23:24, Sergey Beryozkin wrote:

> Hi
> On 20/03/13 19:03, Daniel Bimschas wrote:
>> 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?
>> 
> Looks like you also need to add Jettison dependency explicitly, at the moment 
> rt-rs-extension-providers has few optional providers bundled and thus the 
> expectation is that the individual optional provider modules will be added 
> explicitly. I was a bit conscious at a time of having 5+ extra very small 
> modules added instead...
> 
> Give it a try please
> Cheers, Sergey
> 
>> 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.
>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 
> 

Reply via email to