10 KiB
提示词:WSDL 转换功能
引用真源
需求描述
根据需求文档,实现 WSDL 转换功能,包括以下核心功能:
-
从 URL 转换 WSDL:
- 接收 WSDL URL、包名、是否生成异步代码参数
- 调用 Salesforce Apex API 的 wsdlToApex 方法
- 保存转换结果到数据库
- 返回转换结果(生成的 Apex 类信息)
-
从 XML 转换 WSDL:
- 接收 WSDL XML 内容、包名、是否生成异步代码参数
- 调用 Salesforce Apex API 的 wsdlToApex 方法
- 保存转换结果到数据库
- 返回转换结果(生成的 Apex 类信息)
-
查询转换历史:
- 支持分页查询
- 支持多条件筛选(状态、用户 ID、租户 ID、Org 类型、时间范围)
- 返回转换历史列表
-
获取转换详情:
- 根据转换 ID 查询转换详情
- 包含转换基本信息和生成的 Apex 类代码列表
-
下载单个 Apex 类代码:
- 根据类 ID 查询 Apex 类代码
- 返回 Apex 类代码内容
-
批量下载 Apex 类代码:
- 根据转换 ID 查询所有生成的 Apex 类代码
- 使用 Apache Commons Compress 将多个 Apex 类代码打包成 ZIP 文件
- 返回 ZIP 文件流
设计方案
根据设计文档,采用以下技术方案:
-
技术栈:
- Spring Boot 2.7.x:Controller、Service 层
- MyBatis Plus 3.5.x:Mapper、Entity 层
- MySQL 8.0+:数据持久化
- apex.jar:Salesforce Apex API 集成
- Apache Commons Compress:ZIP 压缩
-
架构设计:
- 分层架构:Controller -> Service -> Mapper -> Entity
- 模块:
datai-salesforce-apex - 包结构:
- controller:ApexWsdlController
- service:IApexWsdlService、impl.ApexWsdlServiceImpl
- mapper:DataiApexWsdlConversionMapper、DataiApexWsdlClassMapper
- domain:DataiApexWsdlConversion、DataiApexWsdlClass
- model.dto:ConvertWsdlFromUrlDto、ConvertWsdlFromXmlDto、QueryConversionsDto
- model.vo:WsdlConversionVo、WsdlConversionDetailVo、WsdlClassVo、WsdlToApexResultVo
-
数据模型:
- datai_apex_wsdl_conversion 表:存储转换基本信息
- datai_apex_wsdl_class 表:存储生成的 Apex 类代码
- 一对多关系:一个转换可以包含多个生成的 Apex 类
- 级联删除:删除转换时自动删除对应的 Apex 类
-
并发控制:
- 使用 ReentrantLock 保证多线程安全
- 方法级别的锁粒度
-
集成方案:
- 使用 ApexConnectionFactory 获取 SoapConnection 实例
- 固定使用 source org 类型
输出格式要求
-
必须包含以下文件:
Controller 层:
ApexWsdlController.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/controller/ApexWsdlController.java)
Service 层:
IApexWsdlService.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/service/IApexWsdlService.java)ApexWsdlServiceImpl.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/service/impl/ApexWsdlServiceImpl.java)
Mapper 层:
DataiApexWsdlConversionMapper.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/mapper/DataiApexWsdlConversionMapper.java)DataiApexWsdlClassMapper.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/mapper/DataiApexWsdlClassMapper.java)
Entity 层:
DataiApexWsdlConversion.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/domain/DataiApexWsdlConversion.java)DataiApexWsdlClass.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/domain/DataiApexWsdlClass.java)
DTO 层:
ConvertWsdlFromUrlDto.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/dto/ConvertWsdlFromUrlDto.java)ConvertWsdlFromXmlDto.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/dto/ConvertWsdlFromXmlDto.java)QueryConversionsDto.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/dto/QueryConversionsDto.java)
VO 层:
WsdlConversionVo.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/vo/WsdlConversionVo.java)WsdlConversionDetailVo.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/vo/WsdlConversionDetailVo.java)WsdlClassVo.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/vo/WsdlClassVo.java)WsdlToApexResultVo.java(路径:datai-salesforce-apex/src/main/java/com/datai/apex/model/vo/WsdlToApexResultVo.java)
-
必须包含单元测试:
ApexWsdlServiceTest.java(路径:datai-salesforce-apex/src/test/java/com/datai/apex/service/ApexWsdlServiceTest.java)
-
必须符合 Spring Boot 最佳实践:
- 使用 @RestController 注解
- 使用 @Autowired 注解进行依赖注入
- 使用 @Service 注解
- 使用 @Transactional 注解进行事务管理
-
必须遵循 MyBatis Plus 规范:
- Entity 类使用 @TableName 注解指定表名
- 主键使用 @TableId 注解
- 字段使用 @TableField 注解
- Mapper 接口继承 BaseMapper
-
必须使用若依框架规范:
- 使用 @PreAuthorize 注解进行权限控制
- 使用 @Log 注解记录操作日志
- 使用 @DataScope 注解进行数据权限控制
- 使用 GlobalExceptionHandler 处理异常
-
必须使用 Apache Commons Compress 进行 ZIP 压缩:
- 使用 ZipArchiveOutputStream 创建 ZIP 文件
- 使用 ZipArchiveEntry 添加 ZIP 条目
- 设置压缩级别为 BEST_COMPRESSION
代码规范要求
-
类命名:
- Controller 类:首字母大写,驼峰命名,如
ApexWsdlController - Service 接口:以
I开头,如IApexWsdlService - Service 实现类:以
Impl结尾,如ApexWsdlServiceImpl - Mapper 接口:首字母大写,驼峰命名,如
DataiApexWsdlConversionMapper - Entity 类:首字母大写,驼峰命名,如
DataiApexWsdlConversion - DTO 类:以
Dto结尾,如ConvertWsdlFromUrlDto - VO 类:以
Vo结尾,如WsdlConversionVo
- Controller 类:首字母大写,驼峰命名,如
-
方法命名:
- 首字母小写,驼峰命名,如
convertWsdlFromUrl - 查询方法:以
get、query、list开头,如getConversionDetail、queryConversions - 转换方法:以
convert开头,如convertWsdlFromUrl - 下载方法:以
download开头,如downloadClassCode、downloadClassesAsZip
- 首字母小写,驼峰命名,如
-
变量命名:
- 首字母小写,驼峰命名,如
wsdlUrl、packageName - 常量:全大写,下划线分隔,如
ORG_TYPE
- 首字母小写,驼峰命名,如
-
注释规范:
- 类注释:使用
/** */,包含类功能描述、作者、创建时间 - 方法注释:使用
/** */,包含方法功能、参数、返回值、异常描述 - 字段注释:使用
/** */,包含字段功能描述 - Entity 类字段注释:使用 @TableField 注解的 comment 属性
- 类注释:使用
-
代码格式:
- 使用 4 个空格缩进
- 行宽不超过 120 字符
- 大括号另起一行
-
导入规范:
- 使用 import 静态导入
- 避免通配符导入
- 按照标准顺序导入(JDK、第三方、项目内部)
测试要求
-
单元测试覆盖率不低于 80%
-
测试用例包含以下场景:
从 URL 转换 WSDL:
- 正常转换成功
- WSDL URL 不存在
- WSDL URL 格式错误
- Salesforce 连接失败
- 转换失败
从 XML 转换 WSDL:
- 正常转换成功
- WSDL XML 内容为空
- WSDL XML 格式错误
- Salesforce 连接失败
- 转换失败
查询转换历史:
- 正常查询成功
- 分页查询
- 多条件筛选(状态、用户 ID、租户 ID、Org 类型、时间范围)
- 查询结果为空
获取转换详情:
- 正常获取成功
- 转换 ID 不存在
下载单个 Apex 类代码:
- 正常下载成功
- 类 ID 不存在
批量下载 Apex 类代码:
- 正常下载成功
- 转换 ID 不存在
- 转换没有生成的 Apex 类
-
使用 JUnit 5 和 Mockito 进行测试
-
测试用例命名规范:
test+方法名+场景,如testConvertWsdlFromUrlSuccess -
测试数据使用 Mockito 模拟
注意事项
-
必须使用 ReentrantLock 保证多线程安全:
- 在 convertWsdlFromUrl 和 convertWsdlFromXml 方法中使用 wsdlConversionLock
- 使用 try-finally 确保锁的释放
-
必须固定使用 source org 类型:
- 在 ApexWsdlServiceImpl 中定义常量
private static final String ORG_TYPE = "source" - 使用 ApexConnectionFactory.getConnection(ORG_TYPE) 获取 SoapConnection 实例
- 在 ApexWsdlServiceImpl 中定义常量
-
必须使用若依的 @PreAuthorize 注解进行权限控制:
- apex:wsdl:convert:WSDL 转换权限
- apex:wsdl:query:WSDL 查询权限
- apex:wsdl:download:WSDL 下载权限
-
必须使用若依的 @Log 注解记录操作日志:
- 记录 WSDL 转换操作
- 记录查询操作
- 记录下载操作
-
必须使用若依的 GlobalExceptionHandler 处理异常:
- SalesforceAuthException:认证失败异常
- SalesforceOperationException:操作失败异常
- SalesforceValidationException:参数验证异常
-
必须使用 Apache Commons Compress 进行 ZIP 压缩:
- 设置压缩级别为 BEST_COMPRESSION
- 设置 ZIP 条目名称为类名 + ".apex"
- 使用 UTF-8 编码
-
必须处理 Salesforce API 的空值情况:
- WsdlToApexResult 可能为空
- WsdlToApexInfo 可能为空
- 生成的 Apex 类列表可能为空
-
必须使用 MyBatis Plus 的分页功能:
- 使用 Page 对象进行分页
- 使用 IPage 接口返回分页结果
-
必须使用 MyBatis Plus 的条件构造器:
- 使用 QueryWrapper 构建查询条件
- 使用 Lambda 表达式避免字段名硬编码
-
必须使用 @Transactional 注解进行事务管理:
- 在 convertWsdlFromUrl 和 convertWsdlFromXml 方法中使用
- 确保转换记录和 Apex 类记录的原子性插入