近日完成一个系统,是从一个庞大的母系统中剥离出来的,因此不可避免地要调用母系统的API。我的开发和UT分两步走的,边界部分的代码使用变量devModel隔开(if ...else...)。具体是:
1、本机开发和UT阶段(devModel=true)。引用母系统的interface.jar,当需要使用母系统的实现类时,在test-src包中实现接口,只编写几个使用到的方法。
2、集成测试阶段(devModel=false)。因为母系统非常混杂、jar和xml的依赖根本无法准确地分割,而且又没有开发webService,这就使得任何引用母系统jar的企图都变得不可能。在最少引进其他技术和framework、不增加软硬件开销的情况下(例如可以使用spring-mdp+mq),我只得硬着头皮想想能否通过纯JavaAPI的方式作远程调用。于是想到了Apache HttpClient,因为我知道,其实许多的webservice实现都是基于HttpClient的。
有了想法,立刻动手尝试。
1) xxx-beanName.properties 配置目标系统中使用到的母系统Spring容器中Service接口的BeanId。
2)新增一个母系统代理类 XXXServiceInvokerImpl,该类按照母系统Service接口的样式定义需要调用的方法,将beanName、methodName、args作为HttpClient的post参数提交,参数的序列化采用json格式。
3)往母系增加一个页面yyyCalled.jsp,该页面通过request.getParameter()获取目标系统提交的参数,通过Spring的WebApplicationContext能够轻易地得到Bean上下文,这样就成了本地接口的调用,完成后将结果以Json输出到out中。
总结:这样一来,我的子系统就摆脱了母系统的种种依赖和本事jar版本升级的烦恼,而且对于母系统的开发者而言,也不用为我作任何工作(写ws),我侵入的代码仅仅是一个jsp和3~4的jar包。
也许参数和结果的序列化使用json并不是最好的方案,后续再做研究。