给一份Webservice接口通用实现!!
看到许多中小项目的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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class AddResponse extends DataResponse<AddResultData>{ private AddResultData resultData; public AddResultData getResultData() { return resultData; } public void setResultData(AddResultData resultData) { this.resultData = resultData; } }
AddResultData:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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接口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的孩子。
相关的代码附件地址:【https://files.cnblogs.com/MartinChen999/webservice.rar】
posted on 2012-11-18 14:25 small.ming 阅读(47563) 评论(1) 编辑 收藏 举报