Hi Andrei, Thanks for your reply.
Basically, I am trying to use dispatch API to invoke a SOAP Service with WS-Security & WS-Addressing enabled. So, how we will be able to use interceptors concept in CXF, to add Security headers to SOAP request envelope. Any references to such sample implementation for this, will be great helpful. Thanks, Chandu. On Wed, Jan 8, 2014 at 2:41 PM, Andrei Shakirin <[email protected]>wrote: > Hi, > > Could you explain your use case a bit more, what CXF functionality you > need in conjunction with Dispatch? > > Regards, > Andrei. > > > -----Original Message----- > > From: Chandra Sekhar [mailto:[email protected]] > > Sent: Dienstag, 7. Januar 2014 12:31 > > To: [email protected] > > Subject: Re: Query regarding CXF dynamic dispatch client > > > > Andrei, Thanks again. > > > > Do you have any references to such implementation. > > > > Also, any more insights to it, please. > > > > Thanks, > > Chandu. > > > > > > > > On Tue, Jan 7, 2014 at 4:12 PM, Andrei Shakirin > > <[email protected]>wrote: > > > > > > > > > -----Original Message----- > > > > From: Chandra Sekhar [mailto:[email protected]] > > > > Sent: Dienstag, 7. Januar 2014 11:24 > > > > To: [email protected] > > > > Subject: Re: Query regarding CXF dynamic dispatch client > > > > > > > > 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-*). > > > > > > > > > > Yes, CXF features like security, ws-addressing, ws-policy are > > > available also for Dispatch case. > > > Under standard JAX-WS API call you will invoke CXF implementation with > > > interceptors chain, etc. > > > > > > Regards, > > > Andrei. > > > > > > > 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 > > > > > > > > >
