Hi Rahul,
The problem is the namespace in which the result of the service is defined.
If you map the result using the the SOAPMappingRegistry like so:
{
...
SOAPMappingRegistry smr = new SOAPMappingRegistry();
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new
QName("http://localhost/", "AddResult"), Integer.class, null, new
IntObjectDeserializer());
call.setSOAPMappingRegistry(smr);
...
}
then it should map to the correct encoding type. Currently you're telling the
deserializer to use the "http://schemas.xmlsoap.org/soap/encoding/" namespace
but the service is defining it in the "http://localhost/" namespace. ( see
the c# line with the code {ResponseNamespace="http://localhost/"})
Hope that helps :)
On Monday 10 September 2001 15:19, [EMAIL PROTECTED] wrote:
Hi,
I am trying to invoke a .Net enabled web service using Java with Apache SOAP
toolkit.
I get the following exception:
[SOAPException: faultCode=SOAP-ENV:Client; msg=No Deserializer found to
deserialize a 'http://localh ost/:AddResult' using encoding style
'http://schemas.xmlsoap.org/soap/encoding/'.; targetException=j
ava.lang.IllegalArgumentException: No Deserializer found to deserialize a
'http://localhost/:AddResu lt' using encoding style
'http://schemas.xmlsoap.org/soap/encoding/'.] at
org.apache.soap.rpc.Call.invoke(Call.java:246)
at SoapClient1.main(SoapClient1.java:39)
Here's my trial code:
/*
* SoapClient1.java
*
* Created on September 9, 2001, 5:15 PM
*/
// Required due to use of URL class , required by Call class
import java.net.*;
// Required due to use of Vector class
import java.util.*;
// Apache SOAP classes used by client
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
/**
*
* @author srahul
* @version
*/
public class SoapClient1 {
/** Creates new SoapClient1 */
public SoapClient1() {
}
public static void main(String[] args) {
Call call = new Call();
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
call.setTargetObjectURI("urn:CalcSoap");
call.setMethodName ("Add");
Vector params=new Vector();
params.addElement (new Parameter ("x", String.class, "1", null));
params.addElement(new Parameter ("y", String.class, "2", null));
call.setParams(params);
try {
URL url = new URL ("http://161.85.17.164/calc.asmx");
Response resp = call.invoke(url, "http://localhost/Add");
if (resp.generatedFault()) {
Fault fault=resp.getFault();
System.out.println(" Fault code: " + fault.getFaultCode());
System.out.println(" Fault string: "+fault.getFaultString());
}
Parameter result=resp.getReturnValue();
Object o = result.getValue();
} catch (Exception e) {
e.printStackTrace();
}
}
}
However i am able to iunvoke the service quite easily using c# and the proxy
code that VStudio .Net generates.
Here's the proxy file that is generated by Vstudio.net (if it is of any
use...)
//--------------------------------------------------------------------------
---- // <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.0.2914.16
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//---------------------------------------------------------------------------
---
namespace GeorgeCalc.WebReference1 {
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.Web.Services;
[System.Web.Services.WebServiceBindingAttribute(Name="CalcSoap",
Namespace="http://localhost/")] public class Calc :
System.Web.Services.Protocols.SoapHttpClientProtocol {
[System.Diagnostics.DebuggerStepThroughAttribute()]
public Calc() {
this.Url = "http://161.85.17.164/calc.asmx";
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://localhost
/Add", RequestNamespace="http://localhost/",
ResponseNamespace="http://localhost/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int Add(int x, int y) {
object[] results = this.Invoke("Add", new object[] {
x,
y});
return ((int)(results[0]));
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public System.IAsyncResult BeginAdd(int x, int y,
System.AsyncCallback callback, object asyncState) { return
this.BeginInvoke("Add", new object[] {
x,
y}, callback, asyncState);
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public int EndAdd(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
}
}
Can someone please let me know, what i am doing wrong here???
thanks!
==Rahul==
-------------------------------------------
[EMAIL PROTECTED]
Ph: 5579000 Extn: 1029
-------------------------------------------
--
Regards,
Minh Kama Yie
Nuix