Hi, Thank you very much for the quick response. I will look into these approaches and keep you posted regarding the progress.
Best Regards, Natasha Wijesekare On Tue, Mar 29, 2016 at 12:19 PM, Nandika Jayawardana <[email protected]> wrote: > That approach looks promising. Another option is to use the membrane SOA > library we used human task rendering implementation to construct the soap > payload. Also take a look into the existing activiti web services task. If > we can take the existing web services task from activiti and make it > production ready, that should also be fine. > > Regards > Nandika > > On Tue, Mar 29, 2016 at 10:57 AM, Hasitha Aravinda <[email protected]> > wrote: > >> Yes, IMO this approach is very complicated and we will face more >> issues when we are going to integrate with WebService Task. Can you have a >> look at [1] and try that ? >> >> [1] - >> http://stackoverflow.com/questions/6849892/whats-a-good-java-library-for-dynamic-soap-client-operations >> >> >> Thanks, >> Hasitha. >> >> On Mon, Mar 28, 2016 at 12:07 PM, Natasha Wijesekara <[email protected]> >> wrote: >> >>> Hi, >>> >>> There are many complexities when trying to implement a SOAP client using >>> the dynamic client capability of Apache CXF. I was able to provide a >>> workaround for the error which occurred when passing parameters to a SOAP >>> operation with Apache CXF . >>> >>> The workaround provided does not work with WSDLs which have complex >>> types as the request or response message type i.e. the request/response >>> message parts of the WSDL can be primitive or complex, so 2 different >>> approaches should be followed to get/set the values of the primitive and >>> complex types respectively. When having complex types, the message part is >>> iterated over multiple times, which will take more processing time and >>> reduce the performance. >>> >>> The approach I used is described below. By using this approach the >>> JaxWsDynamicClientFactory takes care of generating Java classes for complex >>> types : >>> >>> Create a new instance of the Client using the JaxWsDynamicClientFactory by >>> passing the wsdl url. The url of the WSDL, operation name and the input >>> variables is provided by the user. >>> >>> >>> >>> >>> >>> *JaxWsDynamicClientFactory factory = >>> JaxWsDynamicClientFactory.newInstance();URL wsdlURL = new >>> URL("http://localhost:9763/services/DivisionProcessService?wsdl >>> <http://10.100.4.192:9763/services/DivisionProcessService?wsdl>");String >>> operationName = "process";Client client = >>> factory.createClient(wsdlURL.toExternalForm());ClientImpl clientImpl = >>> (ClientImpl) client;* >>> >>> Get the endpoint i.e. the URL where the web service can be accessed by a >>> client application using the cilent. >>> >>> *Endpoint endpoint = clientImpl.getEndpoint();* >>> >>> Get the target namespace of the WSDL by creating a ServiceInfo object >>> which walks over the CXF service model >>> >>> *ServiceInfo serviceInfo = >>> endpoint.getService().getServiceInfos().get(0);* >>> *String targetNameSpace = serviceInfo.getTargetNamespace();* >>> >>> Get the binding name of the WSDL by creating a BindingInfo object which >>> gets the name of the binding. >>> >>> *BindingInfo bindingInfo = serviceInfo.getBindings().iterator().next();* >>> *String bName = bindingInfo.getName().getLocalPart();* >>> >>> Create a Qname by passing the namespace and the binding name as >>> parameters and get the binding which has the specified QName. >>> >>> *QName bindingName = new QName(targetNameSpace, bName);* >>> *BindingInfo binding = serviceInfo.getBinding(bindingName);* >>> >>> Get details about the soap operation which is to be invoked by creating >>> a QName with the namespace and the operation name. >>> >>> *QName opName = new QName(targetNameSpace, operationName);* >>> *BindingOperationInfo boi = binding.getOperation(opName);* >>> >>> Get the input/request message type >>> *BindingMessageInfo inputMessageInfo = boi.getInput();* >>> *List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();* >>> *MessagePartInfo partInfo = parts.get(0);* >>> >>> Get the class type of the request/input message and dynamically create >>> an instance of it >>> *Class<?> partClass = partInfo.getTypeClass();* >>> *Object obj = partClass.newInstance();* >>> >>> The input variables provided by the user is stored inside a HashTable >>> which will hold the variable name and its value as a key-value pair >>> >>> *Hashtable table = new Hashtable();* >>> *table.put("dividend", 40);* >>> *table.put("divisor", 10);* >>> >>> Get the methods from the generated request class. This class will have >>> getter and setter methods for the variables taken as the input/request. >>> >>> *Method [] methods = obj.getClass().getDeclaredMethods();* >>> *for(Method m : methods){* >>> * if(m.getName().contains("set")){* >>> * String methodName = m.getName(); * >>> * Class<?> paramType = m.getParameterTypes()[0];* >>> * String[] output = methodName.split("set");* >>> * String varName = output[1].toLowerCase(); * >>> * Object value = table.get(varName); * >>> * Method m1 = obj.getClass().getMethod(methodName, paramType); * >>> * m1.invoke(obj, value);* >>> * } else {* >>> * }* >>> *}* >>> >>> Invoking the operation >>> *Object[] response = client.invoke(operationName, obj);* >>> >>> Get the methods from the generated response class. This class will have >>> getter >>> and setter methods for the variables given as the output. >>> >>> *Method [] responseMethods = >>> response[0].getClass().getDeclaredMethods();* >>> *for(Method rm : responseMethods){* >>> * if(rm.getName().contains("get")){* >>> * String responseMethod = rm.getName();* >>> * Object result = >>> response[0].getClass().getMethod(responseMethod).invoke(response[0]);* >>> * System.**out**.println("Response: " + result);* >>> * } else {* >>> * }* >>> *}* >>> >>> Is this approach correct or is there any way to overcome these >>> limitations when using CXF ? >>> >>> Any suggestions and feedback are highly appreciated. >>> >>> Best Regards, >>> >>> Natasha Wijesekare >>> >>> On Thu, Mar 17, 2016 at 4:47 PM, Natasha Wijesekara <[email protected]> >>> wrote: >>> >>>> Hi , >>>> >>>> I tried passing the operation name with the namespace but it didn't >>>> work. I get the same exception as below. >>>> >>>> *java.lang.IllegalArgumentException: Part >>>> {http://wso2.org/wso2con/2011/sample/adder}payload >>>> <http://wso2.org/wso2con/2011/sample/adder%7Dpayload> should be of type >>>> org.wso2.wso2con._2011.sample.adder.AdderProcessRequest, not >>>> java.lang.Integer* >>>> * at >>>> org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:284)* >>>> * at >>>> org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:212)* >>>> * at >>>> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:122)* >>>> * at >>>> org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)* >>>> * at >>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)* >>>> * at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:572)* >>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:481)* >>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)* >>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)* >>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)* >>>> * at cxfClient_1.main(cxfClient_1.java:61)* >>>> * at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)* >>>> * at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)* >>>> * at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)* >>>> * at java.lang.reflect.Method.invoke(Method.java:606)* >>>> * at >>>> com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)* >>>> >>>> Best Regards, >>>> Natasha Wijesekare >>>> >>>> On Thu, Mar 17, 2016 at 3:39 PM, Himasha Guruge <[email protected]> >>>> wrote: >>>> >>>>> Hi Natasha, >>>>> >>>>> Can you try passing the operation name with the namespace as well? >>>>> >>>>> Regards, >>>>> Himasha >>>>> >>>>> On Thu, Mar 17, 2016 at 2:16 PM, Natasha Wijesekara <[email protected]> >>>>> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I'm trying to invoke an external soap service operation which takes >>>>>> integers as the parameters. >>>>>> >>>>>> *Request Body of the Soap Service *: >>>>>> >>>>>> *<soapenv:Envelope >>>>>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ >>>>>> <http://schemas.xmlsoap.org/soap/envelope/>" >>>>>> xmlns:add="http://wso2.org/wso2con/2011/sample/adder >>>>>> <http://wso2.org/wso2con/2011/sample/adder>">* >>>>>> * <soapenv:Header/>* >>>>>> * <soapenv:Body>* >>>>>> * <add:AdderProcessRequest>* >>>>>> * <add:a>?</add:a>* >>>>>> * <add:b>?</add:b>* >>>>>> * </add:AdderProcessRequest>* >>>>>> * </soapenv:Body>* >>>>>> *</soapenv:Envelope>* >>>>>> >>>>>> I have created a client to invoke the soap operation using >>>>>> JaxWsDynamicClientFactory. >>>>>> JaxWsDynamicClientFactory clientFactory = >>>>>> JaxWsDynamicClientFactory.newInstance(); >>>>>> >>>>>> I have invoked the operation by passing the operation name and the >>>>>> parameters to the client. >>>>>> When multiple parameters of type *string* is passed, no error is >>>>>> given. >>>>>> >>>>>> In this request I need to pass 2 *integers* as the parameters as >>>>>> shown below : >>>>>> client.invoke("operationName", num1, num2); >>>>>> But when I do so I get the following error : >>>>>> >>>>>> *java.lang.IllegalArgumentException: Part >>>>>> {http://wso2.org/wso2con/2011/sample/adder}payload >>>>>> <http://wso2.org/wso2con/2011/sample/adder%7Dpayload> should be of type >>>>>> org.wso2.wso2con._2011.sample.adder.AdderProcessRequest, not >>>>>> java.lang.Integer* >>>>>> * at >>>>>> org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:284)* >>>>>> * at >>>>>> org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:212)* >>>>>> * at >>>>>> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:122)* >>>>>> * at >>>>>> org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)* >>>>>> * at >>>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:572)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:481)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)* >>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:341)* >>>>>> >>>>>> Appreciate any help on this. >>>>>> >>>>>> Best Regards, >>>>>> *Natasha Wijesekare* >>>>>> >>>>>> *Software Engineering Intern, WSO2 Inc: http://wso2.com >>>>>> <http://wso2.com/>* >>>>>> *email : [email protected] <[email protected]>* >>>>>> *mobile: +94 771358651 <%2B94%20771358651>* >>>>>> >>>>>> _______________________________________________ >>>>>> Dev mailing list >>>>>> [email protected] >>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Himasha Guruge >>>>> *Software Engineer* >>>>> WS*O2* *Inc.* >>>>> Mobile: +94 777459299 >>>>> [email protected] >>>>> >>>> >>>> >>>> >>>> -- >>>> *Natasha Wijesekare* >>>> >>>> *Software Engineering Intern, WSO2 Inc: http://wso2.com >>>> <http://wso2.com/>* >>>> *email : [email protected] <[email protected]>* >>>> *mobile: +94 771358651 <%2B94%20771358651>* >>>> >>> >>> >>> >>> -- >>> *Natasha Wijesekare* >>> >>> *Software Engineering Intern, WSO2 Inc: http://wso2.com >>> <http://wso2.com/>* >>> *email : [email protected] <[email protected]>* >>> *mobile: +94 771358651 <%2B94%20771358651>* >>> >>> _______________________________________________ >>> Dev mailing list >>> [email protected] >>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>> >>> >> >> >> -- >> -- >> Hasitha Aravinda, >> Senior Software Engineer, >> WSO2 Inc. >> Email: [email protected] >> Mobile : +94 718 210 200 >> >> _______________________________________________ >> Dev mailing list >> [email protected] >> http://wso2.org/cgi-bin/mailman/listinfo/dev >> >> > > > -- > Nandika Jayawardana > WSO2 Inc ; http://wso2.com > lean.enterprise.middleware > -- *Natasha Wijesekare* *Software Engineering Intern, WSO2 Inc: http://wso2.com <http://wso2.com/>* *email : [email protected] <[email protected]>* *mobile: +94 771358651*
_______________________________________________ Dev mailing list [email protected] http://wso2.org/cgi-bin/mailman/listinfo/dev
