在web service間傳遞java bean

web service的調用返回值都是基本的數據類型,那麼對於java這種具有很強的對象封裝的語言,怎麼來支持各種自定義的java類型的對象處理呢?

在java ee 規範中,我們是推薦使用java類的序列化(即讓類實現Serializable這個接口)的方式,這個在有些情況下容易出現亂碼的問題。

1、返回單個對象的web service的編寫

---1、服務器端的編寫

--------1、寫一個自定義的java類,這個java類就是在 web service中需要傳遞的對象

public class Order implements Serializable{

private String id;

private String name;

set get Method...

}

---------2、對應於上面這個自定義類的服務類

public class OrderService {

public Order returnOrder(Order order) {

Order newOrder  = new Order();//類似臨時對象

//編寫一些業務邏輯

if(order.getId().equals("1")) {

newOrder.setName("Jacky");

} else {

newOrder.setName("Tom");

}

return newOrder;

}

----------3、將他們編譯成class或者jar包,以便於後續的拷貝與部署;

----------4、將編譯好的class文件(或者jar包)拷貝到axis\web-inf\classes的路徑下;

----------5、修改server-config.wsdd配置文件,添加相應的服務配置參數;

<service name="OrderService" provider="java:RPC">

<parameter name="className" value="com.webservice.wsdd.HelloWSDD"/> <!--這裏可以使用通配符-->

<parameter name="allowedMethods" value="returnOrder"/>

<parameter name="scope" value="request/session/application"/>

</service>

但是上面的配置並沒有完成,因爲我們在服務的返回值當中使用了自定義的java bean對象,這個時候我們必須要在我們的配置文件中來加以聲明:

---------6、將自定義的java類的類型,在webservice的配置文件中,進行描述

<service name="OrderService" provider="java:RPC">

<parameter name="className" value="anni.OrderService"/> <!--這裏可以使用通配符-->

<parameter name="allowedMethods" value="returnOrder"/>

<parameter name="scope" value="request/session/application"/>

<beanMapping languageSpecificType="java:anni.Order" qname="nsl:Order" xmlns:nsl="BeanService"  />   <!--這兩個地方可以改動,其他地方固定的-->

<!--如果在類中使用內部類,我們儘量使用靜態內部類,因爲它支持序列化,-->

<!--如果在我們的自定義類的內部有對於另外一個自定義類的依賴,那麼這個時候我們還需要在我們的service服務中在配置一個beanMapping的對應配置節點-->

</service>

----------7、編寫測試客戶端,首先在我們的客戶端一定要有我們在服務器端自定義的類的class或者jar包,也就是說要引用自定義的jar包啦。

String url = "http://localhost:8080/axis/services/OrderService";

Service service = new Service();

Call call = service.createCall();

//這裏註冊javaBean, 注意:和server-config.wsdd編寫的內容一致

QName qn = new QName("urn:BeanService", "Order");

call.registerTypeMapping(Order.class, qn , new BeanSerializerFactory(Order.class, qn), new BeanDeserializerFactory(Order.class, qn);

//創建調用

call.setTargetEndpointAddress(new URL(url));

//調用服務器的方法

call.setOperationName(new QName("order", "returnOrder"));

//設定傳入的參數

call.addParameter("arg1", qn, parameterMode.IN);

//設置返回的類型

call.setReturnType(qn, Order.class);

//接受結果

Order result = call.invoke(new Object[]{order});

System.out.println("the response is "+result);

以上提供了一種編寫的方式,這裏只是一種。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章