Hi Bengt, I think you should create the cxf endpoint using the JaxWsServerFactoryBean like described below: http://cxf.apache.org/docs/jax-ws-java-first-with-jms-transport.html
So you just use another address than in the example there. Christian -----Ursprüngliche Nachricht----- Von: [email protected] [mailto:[email protected]] Im Auftrag von Bengt Rodehav Gesendet: Donnerstag, 26. Mai 2011 14:45 An: [email protected] Betreff: Re: camel-cxf in OSGi, java DSL and iPOJO (no Spring) Thanks for you reply Christian, Yes, I did find your article but I guess I didn't understand it correctly... When you say I should create a "normal cxf endpoint" I thought I was supposed to create a route starting with "from("cxf:")" but maybe you mean I should actually do a "new CxfEndpoint()"? /Bengt 2011/5/26 Christian Schneider <[email protected]> > I think you can do the CamelTransportfactory setup a little simpler > and the route is wrong. > > A long time ago I wrote an article about the Camel transport for cxf > but it should mostly still be valid: > > https://cwiki.apache.org/confluence/display/CAMEL/Better+JMS+Transport > +for+CXF+Webservice+using+Apache+Camel > > Basically you have to create a normal cxf endpoint with > address="camel://direct:endpointname" and then a route in camel: > > from("jetty://http://localhost:8080/servicename > ").to("direct:endpointname") > > So the jetty endpoint receives the request and forwards it to cxf with > the indirection of endpointname. > > I hope that helps > > Christian > > > Am 26.05.2011 13:56, schrieb Bengt Rodehav: > > Christian, >> >> I tried using the camel transport but I got the same exception >> (couldn't find the ITrsWebService class). I'm not sure I did it the >> way you intended. >> What I did was this: >> >> >> * /* >> ** * Initialize camel transport for CXF >> ** */ >> ** BusFactory bf = BusFactory.newInstance(); >> ** Bus bus = bf.createBus(); >> ** CamelTransportFactory camelTransportFactory = new >> CamelTransportFactory(); >> ** camelTransportFactory.setCamelContext(getContext()); >> ** // register the conduit initiator >> ** ConduitInitiatorManager cim = >> bus.getExtension(ConduitInitiatorManager.class); >> ** cim.registerConduitInitiator(CamelTransportFactory.TRANSPORT_ID, >> camelTransportFactory); >> ** // register the destination factory >> ** DestinationFactoryManager dfm = >> bus.getExtension(DestinationFactoryManager.class); >> ** >> dfm.registerDestinationFactory(CamelTransportFactory.TRANSPORT_ID, >> camelTransportFactory); >> ** // set or bus as the default bus for cxf >> ** BusFactory.setDefaultBus(bus); ** >> ** ITrsWebService serverBean = new TrsWebServiceImpl();** >> ** from("jetty:http://localhost:9001/trsws/").to("direct:cxfin"); >> ** >> >> from("cxf:camel:direct:cxfin?serviceClass=se.digia.trs.route.webservi >> ce.ITrsWebService").bean(serverBean); >> * >> >> Not sure why this would help since I still end up with a URI starting >> with "cxf:" and with the parameter >> "serviceClass=se.digia.trs.route.webservice.ITrsWebService". If this >> class couldn't be found before then it can't be found now either. Did >> I misunderstand your suggestion? >> >> /Bengt >> >> >> >> >> >> >> >> >> >> >> >> 2011/5/26 Bengt Rodehav<[email protected]> >> >> This sounds like a new angle. Do you have any pointers as to how I >> do >>> this? >>> Does it limit what I can do with CXF or is it "fully featured"? >>> >>> /Bengt >>> >>> >>> 2011/5/26 Christian Schneider<[email protected]> >>> >>> You might want to try the camel transport for cxf instead. >>>> I think in this case you do not need spring. >>>> >>>> Christian >>>> >>>> >>>> -----Ursprüngliche Nachricht----- >>>> Von: [email protected] [mailto:[email protected]] Im >>>> Auftrag von Bengt Rodehav >>>> Gesendet: Donnerstag, 26. Mai 2011 12:17 >>>> An: [email protected] >>>> Betreff: camel-cxf in OSGi, java DSL and iPOJO (no Spring) >>>> >>>> I have great problems getting camel-cxf to work. I use Camel 2.7.1 >>>> running in Karaf 2.2.0. >>>> >>>> First, lets see what I can get to work... >>>> >>>> If I create my camel context and my cxf endpoint from within Spring >>>> I do get things to work, like this: >>>> >>>> *META-INF/spring/beans.xml* >>>> ... >>>> >>>> *<cxf:cxfEndpoint id="trsWsEndpoint" >>>> ** address="http://localhost:9000/trsws/" >>>> ** >>>> serviceClass="se.digia.trs.route.webservice.ITrsWebService"> >>>> **</cxf:cxfEndpoint>** >>>> **<bean id="routes" class="se.digia.trs.route.webservice.Routes" >>>> />** **<camel:camelContext id="camel"> **<camel:routeBuilder >>>> ref="routes"/> >>>> **</camel:camelContext>* >>>> >>>> ... >>>> >>>> *Routes.java* >>>> ... >>>> >>>> * ITrsWebService serverBean = new TrsWebServiceImpl();** >>>> ** from("cxf:bean:trsWsEndpoint")..bean(serverBean);* >>>> >>>> ... >>>> >>>> Using soapUI I can verify that my implementation class gets called >>>> and that the web service works. >>>> >>>> However I have built a framework using iPOJO that basically creates >>>> the camel context and the route when the iPOJO component is >>>> started. I thus do not have access to any beans/endponts/contexts >>>> instantiated by Spring. >>>> How >>>> can I get this to work? >>>> >>>> I first tried to use cxf:bean like above. However there is no way >>>> (at least I cant find any) to create the cxfEndpoint. I cant refer >>>> to the cxf endpoint instantiated in Spring and I don't seem to be >>>> able to create one of my own from Java. >>>> >>>> I then tried using "cxf:" instead of "cxf:bean" like this: >>>> >>>> * ITrsWebService serverBean = new TrsWebServiceImpl(); >>>> >>>>> from("cxf: >>>>> http://localhost:9001/trsws/?serviceClass=se.digia.trs.route.webse >>>>> rvic >>>>> e.ITrsWebService >>>>> ").bean(serverBean);* >>>>> >>>> >>>> But for some reason camel-cxf can't seem to find the ITrsWebService >>>> class (an interface). I get the following exception: >>>> >>>> >>>> *2011-05-26 11:33:31,655 | ERROR | 01-fdce4f9f0365) | webservice >>>> >>>>> | ? ? | [ERROR] null : >>>>> [trs.route.webservice.8f8bae86-9561-4c21-be01-fdce4f9f0365] The >>>>> callback method start has thrown an exception : Camel context >>>>> failed to start (WS) >>>>> **java.lang.RuntimeException: Camel context failed to start (WS) >>>>> ** at >>>>> se.digia.connect.core.service.RouteServiceBase.doStart(RouteServic >>>>> eBas >>>>> e.java:70) >>>>> ** at >>>>> se.digia.connect.core.service.ServiceBase.start(ServiceBase.java:4 >>>>> 6) >>>>> ** at >>>>> se.digia.trs.route.webservice.WebserviceService.__start(Webservice >>>>> Serv >>>>> ice.java:54) >>>>> ** at >>>>> se.digia.trs.route.webservice.WebserviceService.start(WebserviceSe >>>>> rvic >>>>> e.java) >>>>> ** at sun.reflect.NativeMethodAccessorImpl.invoke0(Native >>>>> Method)[:1.6.0_25] >>>>> ** at >>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorIm >>>>> pl.j >>>>> ava:39)[:1.6.0_25] >>>>> ** at >>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAc >>>>> cess >>>>> orImpl.java:25)[:1.6.0_25] >>>>> ** at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_25] >>>>> ** at >>>>> org.apache.felix.ipojo.util.Callback.call(Callback.java:237)[68:or >>>>> g.ap >>>>> ache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.util.Callback.call(Callback.java:193)[68:or >>>>> g.ap >>>>> ache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallba >>>>> ck.c >>>>> all(LifecycleCallback.java:86)[68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallba >>>>> ckHa >>>>> ndler.__stateChanged(LifecycleCallbackHandler.java:162)[68:org.apache. >>>>> felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallba >>>>> ckHa >>>>> ndler.stateChanged(LifecycleCallbackHandler.java)[68:org.apache.felix. >>>>> ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.ja >>>>> va:4 55)[68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java: >>>>> 336) >>>>> [68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFa >>>>> ctor y.java:165)[68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoF >>>>> acto ry.java:301)[68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoF >>>>> acto ry.java:238)[68:org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.ipojo.IPojoFactory.updated(IPojoFactory.java:634)[68: >>>>> org.apache.felix.ipojo:1.6.8] >>>>> ** at >>>>> org.apache.felix.cm.impl.ConfigurationManager$UpdateConfiguration. >>>>> run( >>>>> ConfigurationManager.java:1567)[5:org.apache.felix.configadmin:1.2 >>>>> .8] >>>>> ** at >>>>> org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:104)[5 >>>>> :org >>>>> .apache.felix.configadmin:1.2.8] >>>>> ** at java.lang.Thread.run(Thread.java:662)[:1.6.0_25] >>>>> **Caused by: java.lang.ClassNotFoundException: >>>>> se.digia.trs.route.webservice.ITrsWebService not found by >>>>> org.apache.camel.camel-cxf [165] >>>>> ** at >>>>> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegat >>>>> ion( >>>>> ModuleImpl.java:787) >>>>> ** at >>>>> org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:7 >>>>> 1) >>>>> ** at >>>>> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass( >>>>> Modu >>>>> leImpl.java:1768) >>>>> ** at >>>>> java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_25] >>>>> ** at >>>>> org.apache.cxf.common.classloader.ClassLoaderUtils.loadClass2(Clas >>>>> sLoa >>>>> derUtils.java:236) >>>>> ** at >>>>> org.apache.cxf.common.classloader.ClassLoaderUtils.loadClass(Class >>>>> Load >>>>> erUtils.java:222) >>>>> ** at >>>>> org.apache.camel.component.cxf.CxfEndpoint.createServerFactoryBean >>>>> (Cxf >>>>> Endpoint.java:378) >>>>> ** at >>>>> org.apache.camel.component.cxf.CxfConsumer.<init>(CxfConsumer.java >>>>> :59) >>>>> ** at >>>>> org.apache.camel.component.cxf.CxfEndpoint.createConsumer(CxfEndpoint. >>>>> java:127) >>>>> ** at >>>>> org.apache.camel.impl.EventDrivenConsumerRoute.addServices(EventDr >>>>> iven >>>>> ConsumerRoute.java:61) >>>>> ** at >>>>> org.apache.camel.impl.DefaultRoute.onStartingServices(DefaultRoute >>>>> .jav >>>>> a:75) >>>>> ** at >>>>> org.apache.camel.impl.RouteService.warmUp(RouteService.java:128) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCa >>>>> melC >>>>> ontext.java:1832) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices >>>>> (Def >>>>> aultCamelContext.java:1758) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(De >>>>> faul >>>>> tCamelContext.java:1548) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCame >>>>> lCon >>>>> text.java:1440) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext. >>>>> java:1336) >>>>> ** at >>>>> org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >>>>> ** at >>>>> org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >>>>> ** at >>>>> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContex >>>>> t.ja >>>>> va:1314) >>>>> ** at >>>>> se.digia.connect.core.service.RouteServiceBase.doStart(RouteServic >>>>> eBas >>>>> e.java:54) >>>>> ** ... 21 more* >>>>> >>>> >>>> How can I expose a web service with camel-cxf completely without >>>> using Spring? Is it even possible? If not, how do I access the cxf >>>> endpoint instantiated by Spring from my java code? >>>> >>>> I should add that I'm using code-first and thus do not use a WSDL file. >>>> >>>> /Bengt >>>> >>>> >>> > > -- > Christian Schneider > http://www.liquid-reality.de > > CXF and Camel Architect > SOPERA - The Application Integration Division of Talend > http://www.talend.com > >
