可扩展多模块Maven项目结构设计与多REST端点统一调用方案咨询
适配多REST端点扩展场景的Maven项目结构
严格按照模块职责隔离拆分,避免单模块代码膨胀:
- 父级聚合POM:统一管理全项目的依赖版本、插件配置,不写业务逻辑,作为所有子模块的继承根
common-core公共模块:存放全链路通用组件,包括统一响应对象MyObject、统一异常对象MyExObject、端点标识枚举、方法标识枚举、REST客户端基础配置(连接池、超时策略、JSON序列化规则)、通用常量,不依赖任何具体端点的实现逻辑ejb-aggregatorEJB聚合模块:承载统一的请求路由、响应聚合、异常兜底逻辑,不实现任何具体端点的调用细节,仅对外暴露统一的EJB调用入口endpoint-adapters端点适配组:组下为每个独立端点拆分单独的子模块,如endpoint1-adapter、endpoint2-adapter……直至endpointN-adapter,每个模块仅负责对应端点的差异化逻辑:入参校验规则、REST请求构造、原始响应解析、端点专属异常映射,模块间无交叉依赖web-entry启动模块:最终打包为WAR包的部署入口,仅负责Web请求接收与转发,无业务逻辑,依赖上述所有模块
EJB层的端点调用绑定与入参适配
完全规避为每个端点、每个方法写重载方法导致的接口膨胀:
- 先在
common-core层定义统一请求载体EndpointRequest,核心字段包括:endpointIdentifier:标识目标端点的枚举值methodIdentifier:标识目标调用方法(如GET_AAA对应原getAaa、GET_BBB对应原getBbb)methodParams:键值对结构的入参容器,承载所有方法的差异化入参
- 在
common-core层定义统一的端点客户端契约RestEndpointClient,约定统一方法签名MyObject invoke(EndpointRequest request),所有端点适配器模块均实现该接口 - 每个端点适配器在实现类上通过元数据注解标记自身对应的端点标识、支持的方法列表、对应方法的入参校验规则
- EJB聚合模块启动时,通过类路径扫描收集所有实现了
RestEndpointClient的实例,自动构建路由表:以「端点标识+方法标识」为key,对应客户端实例为value,无需硬编码分支判断 - 实际调用绑定时:上层只需构造标准
EndpointRequest传入EJB入口,EJB从路由表匹配到对应客户端实例,将请求透传;客户端内部按照自身端点的规则,从methodParams键值对中提取对应入参,完成REST请求构造与发送。整个过程EJB层完全感知不到各端点的入参差异,不需要为每个端点单独编写调用方法。
异构响应与异常的统一封装
- 异构响应封装为
MyObject的逻辑:MyObject结构拆分两部分:一是全端点统一的公共上下文字段,二是承载差异化业务响应的泛型数据字段- 每个端点适配器在拿到自身返回的异构结构响应后,抽取公共上下文字段填充到
MyObject的公共部分,再将原始业务响应对象存入泛型数据字段,作为标准MyObject返回给EJB聚合层 - EJB层拿到的所有响应均为标准
MyObject类型,可直接完成多端点结果聚合,无需解析各端点的响应结构差异
- 各类异常统一封装为
MyExObject的逻辑:- 每个端点适配器内部负责将端点专属的原始异常(如404/500错误、连接超时、响应解析失败、入参校验不通过)映射为统一的异常码、异常消息,不抛出零散的自定义异常
- EJB聚合层对所有客户端调用逻辑做全局try-catch兜底,捕获到任意异常后,统一构造
MyExObject,包含异常码、异常消息、对应端点标识、对应方法标识、原始异常堆栈(按需开放),确保对外暴露的所有异常均为标准结构
扩展落地要点
- 新增端点时,仅需在
endpoint-adapters组下新建对应子模块,实现RestEndpointClient接口并完成适配器逻辑,将模块依赖加入web-entry后即可被EJB层自动识别路由,无需修改原有模块代码 - 全项目统一复用
common-core中的REST客户端配置,避免各适配器重复初始化客户端、重复写序列化逻辑 - 路由表完全通过类路径扫描自动维护,避免硬编码分支导致的新增端点漏配问题
内容的提问来源于stack exchange,提问作者Tadas B.
相关产品推荐
相关产品推荐

