複雜對象可表示的語義比簡單對象強大不少,這裏看看在Java6的WebService中如何使用複雜對象參數。
這裏的參數分兩類,一類是入參,一類是返回值。
複雜對象在並不像想象中那麼簡單,其中還有一些玄機。請看實例:
一、開發服務,通通在服務端
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
* Java6開發的WebService服務端
*
* @author leizhimin 2009-11-16 10:24:13
*/
@WebService
public
class Java6WS {
//返回一個複雜對象
public UserBean doSomething1(String username, String address,
boolean flag) {
return
new UserBean(username, address, flag);
}
//接收一個複雜對象
public String doSomething2(Foo foo) {
return foo.toString();
}
public
static
void main(String[] args) {
//發佈一個WebService
Endpoint.publish(
"http://192.168.14.117:9999/java6ws/Java6WS", new Java6WS());
}
}
/**
* 用戶信息
*
* @author leizhimin 2009-11-16 16:43:35
*/
public
class UserBean {
private String username;
private String address;
private
boolean flag;
public UserBean() {
}
public UserBean(String username, String address,
boolean flag) {
this.username = username;
this.address = address;
this.flag = flag;
}
public String getUsername() {
return username;
}
public
void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public
void setAddress(String address) {
this.address = address;
}
public
boolean isFlag() {
return flag;
}
public
void setFlag(
boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return
"UserBean{" +
"username='" + username + '\'' +
", address='" + address + '\'' +
", flag=" + flag +
'}';
}
}
/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-11-16 17:09:46
*/
public
class Foo {
private String name;
private String sex;
public Foo() {
}
public Foo(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public
void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public
void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return
"Foo{" +
"sex='" + sex + '\'' +
", name='" + name + '\'' +
'}';
}
}
二、生成客戶端代碼
能夠清楚的看出,在客戶端代碼中,已經生成了服務接口和服務實現類,還生成了UserBean和Foo兩個類,而這兩個類和服務端的內容不一樣。
三、寫客戶端測試代碼
import lavasoft.wsclient.Foo;
import lavasoft.wsclient.Java6WS;
import lavasoft.wsclient.Java6WSService;
import lavasoft.wsclient.UserBean;
/**
* 測試Java6 WS生成的客戶端代碼
*
* @author leizhimin 2009-11-16 17:05:00
*/
public
class TestClient {
public
static
void main(String[] args) {
//建立一個客戶端服務對象
Java6WS java6WS =
new Java6WSService().getJava6WSPort();
System.out.println(
"----------java6WS.doSomething1-------------");
//調用服務方法,並獲得方法返回值
UserBean userBean = java6WS.doSomething1(
"zhangsan",
"華中路",
true);
//打印服務的返回值
System.out.println(userBean.toString());
System.out.println(userBean.getUsername() +
" " + userBean.getAddress() +
" " + userBean.isFlag());
System.out.println(
"----------java6WS.doSomething2-------------");
Foo f =
new Foo();
f.setName(
"李四");
f.setSex(
"Man");
String sf = java6WS.doSomething2(f);
System.out.println(sf);
}
}
四、執行客戶端
執行前先啓動服務端。
執行結果以下:
能夠看出,測試很成功。
五、總結
這裏面其實有些細節,須要說明白:
1)、對於複雜對象,必須有一個不帶參數的構造方法。
2)、服務端覆蓋Object的方法不能在客戶端復原,好比toString方法。
3)、服務端的帶參數構造方法在客戶端失效。
以上三點是很是重要的,若是不知道會很鬱悶,老出錯還找不到緣由。