Dan, It works. Thanks a lot.
Xinxin Wang Associate Booz | Allen | Hamilton ________________________________ 151 Industrial Way, Rm. 129 Eatontown, NJ 07724 (732) 935-5315 (office) (732) 935-5220 (fax) [email protected] -----Original Message----- From: Daniel Kulp [mailto:[email protected]] Sent: Wednesday, October 14, 2009 11:29 AM To: [email protected] Cc: Wang, Xinxin [USA] Subject: Re: How to get CXF client from Dispacth<SOAPMessage> The Dispatch stuff isn't a proxy and thus wouldn't work ClientProxy. The way to do it is to cast to the CXF specific class: ((org.apache.cxf.jaxws.DispatchImpl)disp).getClient(); Dan On Wed October 14 2009 11:08:13 am xinxinwang wrote: > I created a dispatch of a CXF service using the SOAPMessage: > > Service service = Service.create(new QName(dataSource.getNamespace(), > dataSource.getServiceName())); QName portQName = new > QName(dataSource.getNamespace(), dataSource.getPortTypeName()); > service.addPort(portQName, "SOAPBinding.SOAP11HTTP_BINDING", > dataSource.getURL()); Dispatch<SOAPMessage> dispSoapMsg = > service.createDispatch(portQName, SOAPMessage.class, > Service.Mode.MESSAGE); > > I tried to get the CXF client using > > Client client = ClientProxy.getClient(dispSoapMsg); > > and got exception: > java.lang.IllegalArgumentException: not a proxy instance > at java.lang.reflect.Proxy.getInvocationHandler(Proxy.java:637) > at org.apache.cxf.frontend.ClientProxy.getClient(ClientProxy.java:93) > at > mil.army.soa.adsl.common.datasource.HTTPSOAPDataSourceUtil.init(HTTPSO > APDat > aSourceUtil.java:140) at > mil.army.soa.adsl.common.test.SOAPDSUtilsFuncTest.testSOAPDSUtilUsingX > Query > (SOAPDSUtilsFuncTest.java:62) at > sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j > ava:3 > 9) at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess > orImp > l.java:25) at java.lang.reflect.Method.invoke(Method.java:597) > at junit.framework.TestCase.runTest(TestCase.java:168) > at junit.framework.TestCase.runBare(TestCase.java:134) > at junit.framework.TestResult$1.protect(TestResult.java:110) > at junit.framework.TestResult.runProtected(TestResult.java:128) > at junit.framework.TestResult.run(TestResult.java:113) > at junit.framework.TestCase.run(TestCase.java:124) > at junit.framework.TestSuite.runTest(TestSuite.java:232) > at junit.framework.TestSuite.run(TestSuite.java:227) > at > org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.j > ava:8 > 1) at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4T > estRe > ference.java:45) at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java: > 38) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote > TestR > unner.java:460) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote > TestR > unner.java:673) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestR > unner > .java:386) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTest > Runne > r.java:196) > > Then, I tried > > Client client = ClientProxy.getClient(dispSoapMsg.getBinding()); > > and got the same exception. > > I also tried to get the port first (it works with Dispactch<Source>): > > SOAPMessage port = service.getPort(portQName, SOAPMessage.class); > Client client = ClientProxy.getClient(port); > > I got another exception: > > java.lang.IllegalArgumentException: javax.xml.soap.SOAPMessage is not > an interface > at java.lang.reflect.Proxy.getProxyClass(Proxy.java:362) > at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) > at > org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFacto > ryBea > n.java:118) at > org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBea > n.jav > a:115) at > org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:437) > at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:315) at > org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:302) at > javax.xml.ws.Service.getPort(Service.java:92) > at > mil.army.soa.adsl.common.datasource.HTTPSOAPDataSourceUtil.init(HTTPSO > APDat > aSourceUtil.java:139) at > mil.army.soa.adsl.common.test.SOAPDSUtilsFuncTest.testSOAPDSUtilUsingX > Query > (SOAPDSUtilsFuncTest.java:62) at > sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j > ava:3 > 9) at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess > orImp > l.java:25) at java.lang.reflect.Method.invoke(Method.java:597) > at junit.framework.TestCase.runTest(TestCase.java:168) > at junit.framework.TestCase.runBare(TestCase.java:134) > at junit.framework.TestResult$1.protect(TestResult.java:110) > at junit.framework.TestResult.runProtected(TestResult.java:128) > at junit.framework.TestResult.run(TestResult.java:113) > at junit.framework.TestCase.run(TestCase.java:124) > at junit.framework.TestSuite.runTest(TestSuite.java:232) > at junit.framework.TestSuite.run(TestSuite.java:227) > at > org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.j > ava:8 > 1) at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4T > estRe > ference.java:45) at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java: > 38) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote > TestR > unner.java:460) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote > TestR > unner.java:673) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestR > unner > .java:386) at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTest > Runne > r.java:196) > > Does anybody know how to get a CXF client from a Dispatch<SOAPMessage>? > Thanks > -- Daniel Kulp [email protected] http://www.dankulp.com/blog
