datai/docs/archive/REQ-014-2.md

62 lines
3.2 KiB
Markdown
Raw Normal View History

# 符号表分析与 DTO 生成需求
## 元数据
- 需求编号014-2
- 创建时间2026-01-26
- 创建人SSOT 架构师
- 状态:已完成
- 优先级:高
- 父需求:[REQ-014](../REQ-014.md)
- 关联代码:`com.sforce.soap.tooling.SymbolTable`, `com.sforce.soap.tooling.ExternalConstructor`
## 需求概述
利用 Tooling API 的 `SymbolTable` 功能,解析 Apex 类的内部结构(内部类、方法、变量),为 Java 端自动生成强类型的 DTOData Transfer Object解决 Partner API 只能传输扁平 SObject 的限制。
**注意**`SymbolTable` 仅在 Tooling API 中可用,需确保已通过 REQ-014-1 完成 Tooling API 连接。
## 目标
1. **符号表获取**:通过 `ToolingConnection` 查询 Apex 类的 `SymbolTable`
2. **结构解析**:解析 `SymbolTable` 中的 `innerClasses`、`methods` 和 `variables`
3. **DTO 生成**:基于解析结果生成 Java POJO 源代码。
## 功能需求
### 核心功能
1. **符号表获取 (SymbolTable Retriever)**
- 接口:`getSymbolTable(String className)`
- 实现:
- 执行 SOQL: `SELECT SymbolTable FROM ApexClass WHERE Name = 'className'`
- **关键点**`SymbolTable` 字段在未编译或无效状态下可能为 null需处理重新编译逻辑如果必要
2. **结构解析器 (Structure Parser)**
- **输入**`com.sforce.soap.tooling.SymbolTable` 对象。
- **解析逻辑**
- 遍历 `innerClasses`:映射为 Java 的静态内部类。
- 遍历 `variables`:映射为 Java 字段注意类型转换Apex `Decimal` -> Java `BigDecimal`)。
- 遍历 `methods`:提取 `ExternalMethod` 信息(仅针对 `webservice` 关键字修饰的方法)。
3. **Java 代码生成器 (Java Code Generator)**
- **模板引擎**:建议使用 JavaPoet 或 FreeMarker。
- **输出**:生成符合 Java Bean 规范的源代码,包含 Getter/Setter。
- **注解支持**:自动添加 Jackson `@JsonProperty` 或 Gson `@SerializedName` 注解。
### 次要功能
- **外部构造函数支持**:处理 `ExternalConstructor`,虽然在 DTO 场景较少用,但需预留扩展。
## 非功能需求
- **类型安全**:生成的 Java 代码应尽可能保留 Apex 的强类型特性。
- **容错性**:对于无法映射的复杂类型(如 `Map<Id, SObject>`),降级为 `Object``Map<String, Object>`
## 技术约束
- **依赖**:必须引用 `com.sforce.soap.tooling.SymbolTable` 类。
- **性能**`SymbolTable` 字段较大,查询时应避免 `SELECT *`,仅查询必要字段。
## 成功标准
1. 能够查询到 `UserSummary` Apex 类的 `SymbolTable`
2. 生成的 Java 类 `UserSummary.java` 包含 `userName`, `totalSales` 等字段,且类型正确。
3. 生成的 Java 类能够成功反序列化来自 Apex WebService 的响应 JSON。
## 相关文档
- [设计文档](../design/2026-01-27-014-2-符号表分析与DTO生成-设计.md)
- [决策记录](../decisions/adr/2026-01-27-014-2-ADR-符号表分析与DTO生成技术选型.md)
- [提示词文档](../prompts/2026-01-27-014-2-prompt-符号表分析与DTO生成.md)
- [变更日志](../changelog/2026-01-27-014-2-changelog.md)