Hi Andrei & All, Thanks for your reply.
Actually I tried the same in my TYPE-2 approach. But, I am concerned about the fact that it uses plain JAX-WS API to dispatch the request. With this approach, shall I be able to leverage the CXF's advanced feature support (like WS-*). Any references to similar implementations are greatly appreciated. Thanks, Chandu. On Tue, Jan 7, 2014 at 2:42 PM, Andrei Shakirin <[email protected]>wrote: > Hi, > > I guess it is use case for the Dispatch interface. The code can look like: > ... > String serviceName = "myService"; > Service service = Service.create(serviceName); > String actualSoapBinding = (soapBinding != null) ? soapBinding : > SOAPBinding.SOAP11HTTP_BINDING; > service.addPort(portName, actualSoapBinding, targetEndpoint); > Dispatch<StreamSource> dispatcher = > service.createDispatch(portName, StreamSource.class, > Service.Mode.PAYLOAD); > ... > StreamSource request; > response = dispatcher.invoke(request); > ... > > You can look also in jaxws_dispatch_provider sample of CXF distribution > for details. > > Regards, > Andrei. > > > -----Original Message----- > > From: Chandra Sekhar [mailto:[email protected]] > > Sent: Montag, 6. Januar 2014 10:09 > > To: [email protected] > > Subject: Query regarding CXF dynamic dispatch client > > > > Hi, > > > > I have a peculiar use-case where in I need to invoke a SOAP Service > without > > refering the WSDL and without creating the stubs & JAXB classes. Custom > > implementation of data mapping well suits to our needs and infact we > have it > > in-place. > > > > I have the following information to invoke the Service : > > > > Style and Use > > Operation Name > > Namespace URI > > SOAPAction > > Endpoint URL > > Binding SOAP version - 1.1/1.2 > > > > > > With the above information we are able to make a service call using > Axis2. > > > > I am trying to achieve the same using CXF. Basically I tried the below. > > > > > > > > import java.io.FileInputStream; > > import java.io.InputStream; > > import java.util.Iterator; > > > > import javax.xml.namespace.QName; > > import javax.xml.soap.MessageFactory; > > import javax.xml.soap.Node; > > import javax.xml.soap.SOAPBody; > > import javax.xml.soap.SOAPEnvelope; > > import javax.xml.soap.SOAPMessage; > > import javax.xml.soap.SOAPPart; > > import javax.xml.ws.Dispatch; > > import javax.xml.ws.Service; > > import javax.xml.ws.soap.SOAPBinding; > > > > import org.apache.cxf.endpoint.Client; > > import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; > > import org.w3c.dom.NodeList; > > > > > > public class CXFClient { > > > > /** > > * @param args > > */ > > public static void main(String[] args) { try { > > //TYPE-1 > > JaxWsDynamicClientFactory dcf = > > JaxWsDynamicClientFactory.newInstance(); > > Client client = dcf.createClient(" > > http://wsekhc1w7:8989/web/SOAPServlet/SOAP/TestService/Sample?WSDL > > "); > > Object[] res = client.invoke("TestServiceSOAP1", "Hello...!"); > > System.out.println("Response ::: " + res[0]); > > //TYPE-2 > > //QName serviceName = new QName("urn:SOAP:TestService:Sample", > > "SampleService"); > > //QName serviceName = new QName("Test", "Test"); QName serviceName > > = new QName("", ""); > > Service service = Service.create(serviceName); > > > > //QName portName = new QName("urn:SOAP:TestService:Sample", > > "SamplePortSOAP"); > > //QName portName = new QName("Test", "Test"); > > QName portName = new QName("", ""); > > > > service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, " > > http://wsekhc1w7:8989/web/SOAPServlet/SOAP/TestService/Sample"); > > Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, > > SOAPMessage.class, Service.Mode.MESSAGE); > > > > // Test request-response > > InputStream is = new > > FileInputStream("F:\\CXF_Demo\\src\\SampleRequestEnvelope.xml"); > > SOAPMessage soapReqMsg = > > MessageFactory.newInstance().createMessage(null, is); > > > > SOAPMessage soapResMsg = dispatch.invoke(soapReqMsg); > > > > SOAPPart soapPart = soapResMsg.getSOAPPart(); > > SOAPEnvelope envelope = soapPart.getEnvelope(); > > SOAPBody body = envelope.getBody(); > > > > Iterator iter = body.getChildElements(); > > while(iter.hasNext()) > > { > > Node tempNode = (Node) iter.next(); > > if(tempNode.getNodeType()==Node.ELEMENT_NODE) > > { > > NodeList list = tempNode.getChildNodes(); > > for(int i=0; i<list.getLength(); i++) > > { > > if(list.item(i).getNodeType() == Node.ELEMENT_NODE) > > { > > NodeList list1 = tempNode.getChildNodes(); > > for(int j=0; j<list.getLength(); j++) > > { > > //System.out.println(list1.item(j).getNodeName()); > > if(list1.item(j).getNodeType() == Node.ELEMENT_NODE) > > { > > System.out.println("NodeName : " + list1.item(j).getNodeName() + "\n > > NodeValue : " + list1.item(j).getFirstChild().getNodeValue()); > > } > > } > > } > > } > > } > > //System.out.println("TempNode : " + tempNode.getNodeName()); > > } > > } > > catch(Exception e) > > { > > e.printStackTrace(); > > } > > } > > } > > > > > > > > In the above code snippet, TYPE-1 is using CXF's dynamic client with > which > > found no way to decouple the WSDL dependency. Because all the > > JaxWsDynamicClientFactory.createClient() overloaded methods need WSDL > > URL. > > > > Though TYPE-2 does the same for us (without WSDL URL), but the concern > > here is that it uses the JAX-WS API and can we be able to embedd the CXF > > feature support (like WS-*). > > > > Suggestion to implement CXF dynamic client (without stubs & classes > > creation) greatly appreciated. > > > > Thanks in advance. > > > > Regards, > > Chandu >
