之前使用.net 和Java通過Web Service調(diào)用,都是傳遞的簡(jiǎn)單類型。最近由于項(xiàng)目需要,需要之間傳遞自定義對(duì)象
做了一個(gè)簡(jiǎn)單的例子,可以調(diào)用成功。
在。net中定義一個(gè)簡(jiǎn)單對(duì)象
public class Person
...{
/**//// <summary>
/// 身份證件號(hào)碼
/// </summary>
public string IdentityNumber
...{
get...{ return m_IdentityNumber; }
set...{ m_IdentityNumber = value; }
}
private string m_IdentityNumber;
}
在WebService中發(fā)布:
[WebMethod]
[SoapRpcMethod
(Action="http://tempurl.org/GetUserInfoByPerson",
RequestNamespace="http://tempurl.org",
ResponseNamespace="http://tempurl.org")
]
public Person GetUserInfoByPerson()
...{
Person p = new Person();
p.IdentityNumber ="1234234342";
return p;
}
注意在使用Java客戶端調(diào)用的時(shí)候,要導(dǎo)入6個(gè)jar的包:axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,saaj.jar,wsdl4j-1.5.1.jar
在java客戶端,注冊(cè)自定義對(duì)象的序列化/反序列化器。
核心代碼如下:
import java.io.Serializable;
public class Person implements Serializable ...{
/** *//** * */
public Person() ...{ }
private static final long serialVersionUID = -6414428095965735488L;
public String IdentityNumber;
}
調(diào)用的代碼:
//注冊(cè)Person的序列化類型
QName qn = new QName("Person");
call.registerTypeMapping(Person.class, qn, new BeanSerializerFactory(Person.class, qn), new BeanDeserializerFactory(Person.class, qn));
call.setOperationName(new QName("http://tempurl.org", "GetUserInfoByPerson"));//設(shè)置請(qǐng)求的命名空間及方法名
String str = "http://localhost/test/testservice.asmx";//web服務(wù)的URL地址
call.setTargetEndpointAddress(new java.net.URL(str));
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://tempurl.org/GetUserInfoByPerson");//設(shè)置SOAPAction
call.setReturnClass(Person.class);
Person p = (Person)call.invoke(new Object[]...{s});
System.out.println("Get WebServices result is: "+p);
System.out.println("Get WebServices result is: "+p.IdentityNumber);
在Java客戶端可以獲取Person的對(duì)象