Hi
On 21/03/13 18:10, Daniel Bimschas wrote:
Whooohoo! That exactly did the trick! Thank you so much for saving me even more 
unproductive hours of guessing!
Thanks for the update; note you can also register Jackson if needed instead
Cheers, Sergey

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.










--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Reply via email to