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);
以上提供了一種編寫的方式,這裏只是一種。