看到許多中小項目的webservice接口的源代碼,不禁有個吐槽的沖動。除了會用CXF,Axis2等神級框架,其他的懶得動了,都是Ctrl+V,Ctrl+C,把其他模塊的Request,Response貼過來。一旦增加某個特性,不得不在所有Request,Response遨游一遍。早知今日,何必當初呢。
寫一個好的Weservice Interface,關鍵是要多多總結。除了有Request,Response之外,還有很多。總結如下有:
Request:webservice的輸入。
Response:webservice輸出。
DataRsponse:帶結果集的webservice輸出。
ResultData:結果集,不同的interface,其ResultData不一樣。
ReslutInfo:描述調用請求成功或者失敗的對象。
WebServiceTemplate:模板類,定義如何調用下層函數,如何處理異常錯誤的流程
ResultDataCallback:回調類,與template配合,適用【返回結果集】操作,比如【獲取用戶信息】,【下訂單】
ResultCallback:回調類,與Template配置,適用於【不返回帶結果集的接口,比如【修改用戶名】
ResponseFactory:用來組裝 webservice消息 的工廠類。
ResultInfoFactory:用來處理異常信息的 工廠類,這個一個接口,為它實現一個默認實例吧。
有了這些小弟們,任何webservice接口的定義都能輕易搞定,不信我舉個例子給你,咱們以【加法】為例!
AddRequest:
View Code
public class AddRequest extends Request{ private int add; private int added; public int getAdd() { return add; } public void setAdd(int add) { this.add = add; } public int getAdded() { return added; } public void setAdded(int added) { this.added = added; } }
AddResonse:
View Code
public class AddResponse extends DataResponse<AddResultData>{ private AddResultData resultData; public AddResultData getResultData() { return resultData; } public void setResultData(AddResultData resultData) { this.resultData = resultData; } }
AddResultData:
View Code
public class AddResultData implements ResultData{ private int sum; public AddResultData(int sum) { super(); this.sum = sum; } public AddResultData() { super(); } public int getSum() { return sum; } public void setSum(int sum) { this.sum = sum; } }
一個簡單的webservice接口:
View Code
public class Soap { public AddResponse add(final AddRequest request){ return WebServiceTemplate.doResult(new ResultDataCallback<AddRequest,AddResponse,AddResultData>(){ public AddResultData done() throws Exception { return new AddResultData(request.getAdd()+request.getAdded()); } public AddResponse getRsp() { return new AddResponse(); } }); } }
一個簡單的TestCase測試:
View Code
public class TestSoap { @Test public void testAdd(){ AddRequest add = new AddRequest(); add.setAdd(1); add.setAdded(2); Soap soap = new Soap(); AddResponse rsp =soap.add(add); assertEquals(3,rsp.getResultData().getSum()); assertEquals("0",rsp.getResultInfo().getResultCode()); assertEquals("success",rsp.getResultInfo().getResultDesc()); } }
雖然這些很簡單,但是能夠解決80%的問題。剩下20%還要根據實際情況來定。況且,這些代碼在你的手中還有持續改優化的空間。千萬不要做一個愛Copy的孩子。
相關的代碼附件地址:【http://files.cnblogs.com/MartinChen999/webservice.rar】
