之前使用.net 和Java通过Web Service调用,都是传递的简单类型。最近由于项目需要,需要之间传递自定义对象
做了一个简单的例子,可以调用成功。
在。net中定义一个简单对象
public
class
Person
... {
/**//// <summary>
/// 身份证件号码
/// </summary>
public string IdentityNumber
...{
get...{ return m_IdentityNumber; }
set...{ m_IdentityNumber = value; }
}
private string m_IdentityNumber;
}
... {
/**//// <summary>
/// 身份证件号码
/// </summary>
public string IdentityNumber
...{
get...{ return m_IdentityNumber; }
set...{ m_IdentityNumber = value; }
}
private string m_IdentityNumber;
}
在WebService中发布:
[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;
}
[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客户端调用的时候,要导入6个jar的包:axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,saaj.jar,wsdl4j-1.5.1.jar
在java客户端,注册自定义对象的序列化/反序列化器。
核心代码如下:
import java.io.Serializable;
public class Person implements Serializable ... {
/** *//** * */
public Person() ...{ }
private static final long serialVersionUID = -6414428095965735488L;
public String IdentityNumber;
}
调用的代码:
//
注册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 " )); // 设置请求的命名空间及方法名
String str = " http://localhost/test/testservice.asmx " ; // web服务的URL地址
call.setTargetEndpointAddress( new java.net.URL(str));
call.setUseSOAPAction( true );
call.setSOAPActionURI( " http://tempurl.org/GetUserInfoByPerson " ); // 设置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);
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 " )); // 设置请求的命名空间及方法名
String str = " http://localhost/test/testservice.asmx " ; // web服务的URL地址
call.setTargetEndpointAddress( new java.net.URL(str));
call.setUseSOAPAction( true );
call.setSOAPActionURI( " http://tempurl.org/GetUserInfoByPerson " ); // 设置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的对象