Java6 WebService 使用複雜對象

複雜對象可表示的語義比簡單對象強大不少,這裏看看在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)、服務端的帶參數構造方法在客戶端失效。
 
以上三點是很是重要的,若是不知道會很鬱悶,老出錯還找不到緣由。
相關文章
相關標籤/搜索