这篇文章不是主流程,看与不看都没关系,至于为什么出这篇文章,纯粹是因为当初写的代码太low,菜鸡写的一样,不规范,看过我文章的大牛们,估计都吐血了。机缘巧合被外派到某丰上班,看了人家写的java的代码,我羞愧难当,学习了一波人家的经验之后,我抽时间建了一个dome项目,重写了一下这个农行对接,虽然学习了人家的代码经验,但我还是很菜,害,路漫漫其修远兮,吾将上下而求索。
之前写法是定一个AbcErpToIctSocket工具类,里面每个接口一个方法,代码很乱七八糟,很多代码也都不需要,有些地方IO流都没有关闭, 有些类也没有明确职责,掺杂很多不应该属于它的代码,这次改成以服务接口方式注入,不再是每个农行接口一个方法,全部农行接口请求都调同一个方法,代码划分职责,然后多余的删掉等等。
本次改造设计如下:
引入包:lombok, fastjson, commons-lang3 |
新增: |
constant: |
1: AbcInterfaceType: 新增枚举-农行接口类型 |
entityDTO: |
request: |
1: AbstractRequest: 请求抽象类,继承RequestBaseEntity |
2: RequestBaseFile: 请求文件对象基类 |
response: |
1: SocketResponseDTO: SocketClientUtil的socket请求响应 |
2: AbstractResponse: 响应抽象类,继承ResponseBaseEntity |
3: ResponseBaseFile: 响应文件对象基类 |
4: AbcErpRespDTO: 农行接口统一响应DTO |
config: |
1: AbcConfig: 农行配置类,把所有农行配置信息注入该类 |
service: |
1: IAbcErpService: 农行交易接口,只有一个erpRequest方法 |
2: AbstractAbcErp: 农行请求抽象类,实现IAbcErpService,有关请求处理的方法都在这里,核心 |
3: AbcErpService: 农行交易接口实现类,继承AbstractAbcErp,实现IAbcErpService的erpRequest方法,所有农行交易请求都走这个方法 |
修改: |
entityDTO: |
共同点: |
1: 类名简化,request -> req, response -> resp |
2: 去掉get,set方法,用上lombok注解@Data |
3: 所有Double类型字段都换成BigDecimal类型,涉及到钱,稳妥点 |
request: |
1:所有接口requestDTO继承由RequestBaseEntity改成AbstractRequest,并指定AbstractRequest的泛型R,也就是对应的应答报文对象 |
2: IBAF04ReqDTO.FileObject.class、IBBF23ReqDTO.FileObject.class 文件对象类继承RequestBaseFile |
response: |
1:所有接口responseDTO继承由ResponseBaseEntity改成AbstractResponse |
2:CQRC09RespDTO.FileObject.class、IBAQ06RespDTO.IBAF04FileObject.class、IBAQ06RespDTO.IBBF23FileObject.class 文件对象类继承ResponseBaseFile |
RequestBaseEntity: 去掉isEncryption(查询时是否加密)属性 |
SocketClient: 重命名为SocketClientUtil,优化代码,返回值由Map改成SocketResponseDTO,去掉有关农行的代码,明确此工具类职责,加强可复用性 |
XmlUtil: 优化代码,增加对IO流的关闭 |
所有枚举类命名去掉后缀Enum,如原命名:CctransCodeEnum,新命名:CctransCode |
删除: |
去掉枚举类:CctransCodeEnum |
去掉commons-io包引用,相关IO流处理的代码改成手写 |
去掉AbcErpToIctSocket工具类,把里面的所有接口操作归集到AbstractAbcErp抽象类 |
api模块
service模块
项目版图
具体改造代码看下篇文章
码字不易,于你有利,勿忘点赞