# com.sforce.soap.partner 模块说明 ## 概述 `com.sforce.soap.partner` 模块是 Salesforce Partner API 的 Java 客户端实现,提供了与 Salesforce 进行数据交互的 SOAP 接口。Partner API 是一个动态 API,可以访问组织中的任何对象和字段,无需预先定义。 ## 主要功能 ### 1. CRUD 操作 - **Create**: 创建新记录 - **Retrieve**: 检索单个记录 - **Update**: 更新记录 - **Delete**: 删除记录 - **Upsert**: 更新或插入记录 - **Merge**: 合并记录 ### 2. 批量操作 - **Create 批量**: 批量创建记录 - **Update 批量**: 批量更新记录 - **Delete 批量**: 批量删除记录 - **Upsert 批量**: 批量更新或插入记录 ### 3. 查询功能 - **Query**: 执行 SOQL 查询 - **QueryAll**: 查询所有记录(包括已删除的) - **QueryMore**: 获取查询结果的下一页 - **Search**: 执行 SOSL 搜索 ### 4. 描述功能 - **DescribeGlobal**: 描述所有可用对象 - **DescribeSObject**: 描述特定对象 - **DescribeSObjects**: 描述多个对象 - **DescribeLayout**: 描述对象布局 - **DescribeTabs**: 描述标签页 - **DescribeQuickActions**: 描述快速操作 ### 5. 认证和会话 - **Login**: 用户登录 - **Logout**: 用户登出 - **ChangeOwnPassword**: 修改自己的密码 - **SessionHeader**: 会话头信息 ### 6. 高级功能 - **ConvertLead**: 转换线索 - **EmptyRecycleBin**: 清空回收站 - **ProcessSubmitRequest**: 处理提交请求 - **GetUserInfo**: 获取用户信息 - **GetServerTimestamp**: 获取服务器时间戳 ## 核心类 ### Connector **作用**: Partner API 的连接工厂类,负责创建 PartnerConnection 实例。 **主要功能**: - 创建 PartnerConnection 实例 - 管理连接配置 - 设置默认端点 **主要方法**: - `newConnection(String username, String password)`: 使用用户名和密码创建连接 - `newConnection(ConnectorConfig config)`: 使用配置对象创建连接 **默认端点**: `https://login.salesforce.com/services/Soap/u/65.0` **使用示例**: ```java // 使用用户名和密码创建连接 PartnerConnection connection = Connector.newConnection("username", "password"); // 使用配置对象创建连接 ConnectorConfig config = new ConnectorConfig(); config.setUsername("username"); config.setPassword("password"); config.setAuthEndpoint("https://test.salesforce.com/services/Soap/u/65.0"); PartnerConnection connection = Connector.newConnection(config); // 登录并获取会话信息 LoginResult loginResult = connection.login("username", "password"); System.out.println("Session ID: " + loginResult.getSessionId()); System.out.println("Server URL: " + loginResult.getServerUrl()); ``` ### PartnerConnection **作用**: Partner API 的核心连接类,负责执行所有 API 操作。 **主要功能**: - 执行 CRUD 操作(create、update、delete、upsert、merge) - 执行查询操作(query、queryAll、queryMore、search) - 执行描述操作(describeGlobal、describeSObject、describeSObjects) - 管理会话和头部信息 - 执行高级操作(convertLead、emptyRecycleBin、sendEmail 等) **主要方法**: - `login(String username, String password)`: 用户登录 - `logout()`: 用户登出 - `query(String queryString)`: 执行 SOQL 查询 - `queryAll(String queryString)`: 查询所有记录(包括已删除的) - `queryMore(String queryLocator)`: 获取查询结果的下一页 - `search(String searchString)`: 执行 SOSL 搜索 - `create(SObject[] sObjects)`: 创建记录 - `update(SObject[] sObjects)`: 更新记录 - `delete(String[] ids)`: 删除记录 - `undelete(String[] ids)`: 恢复已删除的记录 - `upsert(String externalIdFieldName, SObject[] sObjects)`: 更新或插入记录 - `merge(String id, SObject sObject, String[] duplicateId)`: 合并记录 - `retrieve(String[] fieldsToRetrieve, String type, String[] ids)`: 检索单个记录 - `describeGlobal()`: 描述所有可用对象 - `describeSObject(String sObjectType)`: 描述特定对象 - `describeSObjects(String[] sObjectTypes)`: 描述多个对象 - `convertLead(LeadConvert leadConvert)`: 转换线索 - `emptyRecycleBin(String[] ids)`: 清空回收站 - `sendEmail(SingleEmailMessage[] emails)`: 发送邮件 - `resetPassword(String userId)`: 重置用户密码 - `setPassword(String userId, String newPassword)`: 设置用户密码 **SOAP 头部设置**: - `setQueryOptions(int batchSize)`: 设置查询批处理大小 - `setAssignmentRuleHeader(String assignmentRuleId, Boolean useDefaultRule)`: 设置分配规则头部 - `setEmailHeader(boolean triggerAutoResponseEmail, boolean triggerOtherEmail, boolean triggerUserEmail)`: 设置邮件头部 - `setDisableFeedTrackingHeader(boolean disableFeedTracking)`: 设置禁用 Feed 跟踪头部 - `setAllOrNoneHeader(boolean allOrNone)`: 设置全有或全无头部 - `setAllowFieldTruncationHeader(boolean allowFieldTruncation)`: 设置允许字段截断头部 - `setDuplicateRuleHeader(boolean allowSave, boolean includeRecordDetails, boolean runAsCurrentUser)`: 设置重复规则头部 - `setStreamingEnabledHeader(boolean enableStreaming)`: 设置流式启用头部 **使用示例**: ```java PartnerConnection connection = Connector.newConnection("username", "password"); // 执行查询 QueryResult queryResult = connection.query( "SELECT Id, Name, Industry FROM Account LIMIT 10" ); for (SObject record : queryResult.getRecords()) { System.out.println("Account: " + record.getField("Name")); } // 创建记录 SObject account = new SObject(); account.setType("Account"); account.setField("Name", "Acme Corporation"); account.setField("Industry", "Technology"); SaveResult[] results = connection.create(new SObject[]{account}); // 更新记录 account.setId("001xx000003IAC"); account.setField("Name", "Acme Inc."); connection.update(new SObject[]{account}); // 删除记录 connection.delete(new String[]{"001xx000003IAC"}); // 设置查询选项 connection.setQueryOptions(100); // 设置全有或全无头部 connection.setAllOrNoneHeader(true); ``` ### SObject **作用**: 表示 Salesforce 中的任何对象记录,是一个动态对象,继承自 XmlObject。 **主要功能**: - 动态字段访问和设置 - 类型安全的字段操作 - 支持所有 CRUD 操作 - 支持字段清空(fieldsToNull) - 支持子对象关系 **主要方法**: - `getType()`: 获取对象类型 - `setType(String type)`: 设置对象类型 - `getId()`: 获取记录 ID - `setId(String Id)`: 设置记录 ID - `getField(String name)`: 获取字段值 - `setField(String name, Object value)`: 设置字段值 - `getFieldsToNull()`: 获取要清空的字段列表 - `setFieldsToNull(String[] fieldsToNull)`: 设置要清空的字段列表 - `getSObjectField(String name)`: 获取 SObject 类型的字段值 - `setSObjectField(String name, SObject value)`: 设置 SObject 类型的字段值 - `addChild(XmlObject child)`: 添加子对象 - `getChildren(String name)`: 获取子对象列表 **使用示例**: ```java // 创建 Account 记录 SObject account = new SObject(); account.setType("Account"); account.setField("Name", "Acme Corporation"); account.setField("Industry", "Technology"); account.setField("AnnualRevenue", 1000000.00); // 创建并设置子对象(Contact) SObject contact = new SObject(); contact.setType("Contact"); contact.setField("FirstName", "John"); contact.setField("LastName", "Doe"); account.setSObjectField("Owner", contact); // 设置字段为 null(清空字段) account.setFieldsToNull(new String[]{"AnnualRevenue"}); // 获取字段值 String name = (String) account.getField("Name"); Double revenue = (Double) account.getField("AnnualRevenue"); // 批量创建 SObject[] accounts = new SObject[10]; for (int i = 0; i < 10; i++) { SObject acc = new SObject(); acc.setType("Account"); acc.setField("Name", "Account " + i); accounts[i] = acc; } SaveResult[] results = connection.create(accounts); ``` ### QueryResult **作用**: 表示查询操作的结果,包含查询返回的记录和分页信息。 **主要属性**: - `records`: 记录列表(SObject[]) - `size`: 记录数量(int) - `done`: 是否完成(boolean) - `queryLocator`: 查询定位器(String,用于分页) - `searchRecords`: 搜索记录列表(SearchRecord[]) **主要方法**: - `getRecords()`: 获取记录列表 - `setRecords(SObject[] records)`: 设置记录列表 - `getSize()`: 获取记录数量 - `setSize(int size)`: 设置记录数量 - `isDone()`: 判断是否完成 - `setDone(boolean done)`: 设置是否完成 - `getQueryLocator()`: 获取查询定位器 - `setQueryLocator(String queryLocator)`: 设置查询定位器 **使用示例**: ```java // 执行查询 QueryResult queryResult = connection.query( "SELECT Id, Name, Industry FROM Account LIMIT 10" ); // 遍历记录 for (SObject record : queryResult.getRecords()) { String name = record.getField("Name").toString(); String industry = record.getField("Industry").toString(); System.out.println("Account: " + name + ", Industry: " + industry); } // 处理分页 while (!queryResult.isDone()) { queryResult = connection.queryMore(queryResult.getQueryLocator()); for (SObject record : queryResult.getRecords()) { System.out.println("More records: " + record.getField("Name")); } } // 使用批量大小设置 connection.setQueryOptions(200); QueryResult result = connection.query("SELECT Id, Name FROM Account"); System.out.println("Total records: " + result.getSize()); ``` ### SaveResult **作用**: 表示创建、更新或删除操作的结果,包含操作是否成功和错误信息。 **主要属性**: - `id`: 记录 ID(String) - `success`: 是否成功(boolean) - `errors`: 错误列表(Error[]) **主要方法**: - `getId()`: 获取记录 ID - `setId(String id)`: 设置记录 ID - `isSuccess()`: 判断是否成功 - `getSuccess()`: 获取成功状态 - `setSuccess(boolean success)`: 设置成功状态 - `getErrors()`: 获取错误列表 - `setErrors(Error[] errors)`: 设置错误列表 **使用示例**: ```java // 创建记录 SObject account = new SObject(); account.setType("Account"); account.setField("Name", "Acme Corporation"); SaveResult[] results = connection.create(new SObject[]{account}); // 处理结果 for (SaveResult result : results) { if (result.isSuccess()) { System.out.println("创建成功,ID: " + result.getId()); } else { System.out.println("创建失败"); for (Error error : result.getErrors()) { System.out.println("错误代码: " + error.getStatusCode()); System.out.println("错误消息: " + error.getMessage()); System.out.println("字段: " + String.join(", ", error.getFields())); } } } // 批量更新 SObject[] accounts = new SObject[2]; accounts[0] = new SObject(); accounts[0].setType("Account"); accounts[0].setId("001xx000003IAC"); accounts[0].setField("Name", "Updated Account 1"); accounts[1] = new SObject(); accounts[1].setType("Account"); accounts[1].setId("001xx000003IAD"); accounts[1].setField("Name", "Updated Account 2"); SaveResult[] updateResults = connection.update(accounts); for (SaveResult result : updateResults) { if (result.isSuccess()) { System.out.println("更新成功: " + result.getId()); } } ``` ### DescribeSObjectResult **作用**: 描述对象的元数据,包含对象的详细信息和字段定义。 **主要属性**: - `name`: 对象名称(String) - `label`: 对象标签(String) - `keyPrefix`: ID 前缀(String) - `labelPlural`: 复数标签(String) - `fields`: 字段列表(Field[]) - `childRelationships`: 子关系列表(ChildRelationship[]) - `createable`: 是否可创建(boolean) - `updateable`: 是否可更新(boolean) - `deletable`: 是否可删除(boolean) - `queryable`: 是否可查询(boolean) - `replicateable`: 是否可复制(boolean) - `retrieveable`: 是否可检索(boolean) - `undeletable`: 是否可恢复(boolean) - `triggerable`: 是否可触发(boolean) - `mergeable`: 是否可合并(boolean) - `activateable`: 是否可激活(boolean) - `layoutable`: 是否有布局(boolean) - `searchable`: 是否可搜索(boolean) - `actionOverrides`: 动作覆盖列表(ActionOverride[]) **主要方法**: - `getName()`: 获取对象名称 - `getLabel()`: 获取对象标签 - `getKeyPrefix()`: 获取 ID 前缀 - `getFields()`: 获取字段列表 - `getChildRelationships()`: 获取子关系列表 - `isCreateable()`: 判断是否可创建 - `isUpdateable()`: 判断是否可更新 - `isDeletable()`: 判断是否可删除 - `isQueryable()`: 判断是否可查询 **使用示例**: ```java // 描述 Account 对象 DescribeSObjectResult describeResult = connection.describeSObject("Account"); System.out.println("对象名称: " + describeResult.getName()); System.out.println("对象标签: " + describeResult.getLabel()); System.out.println("ID 前缀: " + describeResult.getKeyPrefix()); System.out.println("可创建: " + describeResult.isCreateable()); System.out.println("可更新: " + describeResult.isUpdateable()); System.out.println("可删除: " + describeResult.isDeletable()); // 遍历字段 for (Field field : describeResult.getFields()) { System.out.println("字段: " + field.getName()); System.out.println(" 类型: " + field.getType()); System.out.println(" 标签: " + field.getLabel()); System.out.println(" 可创建: " + field.isCreateable()); System.out.println(" 可更新: " + field.isUpdateable()); System.out.println(" 必填: " + field.isNillable()); } // 遍历子关系 for (ChildRelationship relation : describeResult.getChildRelationships()) { System.out.println("子关系: " + relation.getChildSObject()); System.out.println(" 字段: " + relation.getField()); } ``` ### DeleteResult **作用**: 表示删除操作的结果,包含删除是否成功和错误信息。 **主要属性**: - `id`: 记录 ID(String) - `success`: 是否成功(boolean) - `errors`: 错误列表(Error[]) **主要方法**: - `getId()`: 获取记录 ID - `setId(String id)`: 设置记录 ID - `isSuccess()`: 判断是否成功 - `getSuccess()`: 获取成功状态 - `setSuccess(boolean success)`: 设置成功状态 - `getErrors()`: 获取错误列表 - `setErrors(Error[] errors)`: 设置错误列表 **使用示例**: ```java // 删除单个记录 DeleteResult[] results = connection.delete(new String[]{"001xx000003IAC"}); for (DeleteResult result : results) { if (result.isSuccess()) { System.out.println("删除成功: " + result.getId()); } else { System.out.println("删除失败: " + result.getId()); for (Error error : result.getErrors()) { System.out.println("错误: " + error.getMessage()); } } } // 批量删除 String[] ids = new String[]{"001xx000003IAC", "001xx000003IAD", "001xx000003IAE"}; DeleteResult[] deleteResults = connection.delete(ids); int successCount = 0; int failureCount = 0; for (DeleteResult result : deleteResults) { if (result.isSuccess()) { successCount++; } else { failureCount++; System.out.println("删除失败: " + result.getId()); } } System.out.println("成功: " + successCount + ", 失败: " + failureCount); ``` ### UpsertResult **作用**: 表示 Upsert(更新或插入)操作的结果,包含操作是否成功、是否创建和错误信息。 **主要属性**: - `id`: 记录 ID(String) - `success`: 是否成功(boolean) - `created`: 是否创建新记录(boolean) - `errors`: 错误列表(Error[]) **主要方法**: - `getId()`: 获取记录 ID - `setId(String id)`: 设置记录 ID - `isSuccess()`: 判断是否成功 - `getSuccess()`: 获取成功状态 - `setSuccess(boolean success)`: 设置成功状态 - `isCreated()`: 判断是否创建 - `getCreated()`: 获取创建状态 - `setCreated(boolean created)`: 设置创建状态 - `getErrors()`: 获取错误列表 - `setErrors(Error[] errors)`: 设置错误列表 **使用示例**: ```java // Upsert 操作(基于外部 ID) SObject account = new SObject(); account.setType("Account"); account.setField("ExternalId__c", "EXT123"); account.setField("Name", "Acme Corporation"); UpsertResult[] results = connection.upsert("ExternalId__c", new SObject[]{account}); for (UpsertResult result : results) { if (result.isSuccess()) { if (result.isCreated()) { System.out.println("创建新记录,ID: " + result.getId()); } else { System.out.println("更新现有记录,ID: " + result.getId()); } } else { System.out.println("Upsert 失败"); for (Error error : result.getErrors()) { System.out.println("错误: " + error.getMessage()); } } } // 批量 Upsert SObject[] accounts = new SObject[2]; accounts[0] = new SObject(); accounts[0].setType("Account"); accounts[0].setField("ExternalId__c", "EXT001"); accounts[0].setField("Name", "Account 1"); accounts[1] = new SObject(); accounts[1].setType("Account"); accounts[1].setField("ExternalId__c", "EXT002"); accounts[1].setField("Name", "Account 2"); UpsertResult[] upsertResults = connection.upsert("ExternalId__c", accounts); ``` ### SearchResult **作用**: 表示 SOSL 搜索操作的结果,包含搜索返回的记录和元数据。 **主要属性**: - `queryId`: 查询 ID(String) - `searchRecords`: 搜索记录列表(SearchRecord[]) - `searchResultsMetadata`: 搜索结果元数据(SearchResultsMetadata) **主要方法**: - `getQueryId()`: 获取查询 ID - `setQueryId(String queryId)`: 设置查询 ID - `getSearchRecords()`: 获取搜索记录列表 - `setSearchRecords(SearchRecord[] searchRecords)`: 设置搜索记录列表 - `getSearchResultsMetadata()`: 获取搜索结果元数据 - `setSearchResultsMetadata(SearchResultsMetadata metadata)`: 设置搜索结果元数据 **使用示例**: ```java // 执行 SOSL 搜索 SearchResult searchResult = connection.search( "FIND {Acme} IN ALL FIELDS RETURNING Account (Id, Name, Industry), " + "Contact (Id, FirstName, LastName)" ); System.out.println("查询 ID: " + searchResult.getQueryId()); // 遍历搜索结果 for (SearchRecord record : searchResult.getSearchRecords()) { SObject sobject = record.getRecord(); String objectType = record.getType(); if (objectType.equals("Account")) { System.out.println("Account: " + sobject.getField("Name")); } else if (objectType.equals("Contact")) { System.out.println("Contact: " + sobject.getField("FirstName") + " " + sobject.getField("LastName")); } } // 获取搜索元数据 SearchResultsMetadata metadata = searchResult.getSearchResultsMetadata(); System.out.println("搜索上下文: " + metadata.getSearchContext()); ``` ### Error **作用**: 表示 API 操作中的错误信息。 **主要属性**: - `statusCode`: 状态代码(StatusCode) - `message`: 错误消息(String) - `fields`: 相关字段列表(String[]) - `extendedErrorDetails`: 扩展错误详情(ExtendedErrorDetails[]) **主要方法**: - `getStatusCode()`: 获取状态代码 - `setStatusCode(StatusCode statusCode)`: 设置状态代码 - `getMessage()`: 获取错误消息 - `setMessage(String message)`: 设置错误消息 - `getFields()`: 获取相关字段列表 - `setFields(String[] fields)`: 设置相关字段列表 - `getExtendedErrorDetails()`: 获取扩展错误详情 - `setExtendedErrorDetails(ExtendedErrorDetails[] details)`: 设置扩展错误详情 **常见错误代码**: - `INVALID_FIELD`: 字段不存在或无效 - `INVALID_ID`: ID 无效 - `MALFORMED_QUERY`: 查询语法错误 - `INVALID_OPERATION`: 操作无效 - `DUPLICATE_VALUE`: 值重复 - `ENTITY_IS_DELETED`: 记录已删除 - `INSUFFICIENT_ACCESS`: 权限不足 - `INVALID_CROSS_REFERENCE_KEY`: 跨引用键无效 **使用示例**: ```java SaveResult[] results = connection.create(new SObject[]{account}); for (SaveResult result : results) { if (!result.isSuccess()) { for (Error error : result.getErrors()) { System.out.println("错误代码: " + error.getStatusCode()); System.out.println("错误消息: " + error.getMessage()); if (error.getFields() != null && error.getFields().length > 0) { System.out.println("相关字段: " + String.join(", ", error.getFields())); } if (error.getExtendedErrorDetails() != null) { for (ExtendedErrorDetails detail : error.getExtendedErrorDetails()) { System.out.println("扩展详情: " + detail.getMessage()); } } } } } ``` ### Field **作用**: 表示对象的字段元数据,包含字段的详细属性。 **主要属性**: - `name`: 字段名称(String) - `label`: 字段标签(String) - `type`: 字段类型(SoapType) - `length`: 字段长度(int) - `precision`: 精度(int) - `scale`: 小数位数(int) - `createable`: 是否可创建(boolean) - `updateable`: 是否可更新(boolean) - `nillable`: 是否可为空(boolean) - `defaultedOnCreate`: 创建时是否有默认值(boolean) - `autoNumber`: 是否自动编号(boolean) - `calculated`: 是否计算字段(boolean) - `custom`: 是否自定义字段(boolean) - `unique`: 是否唯一(boolean) - `externalId`: 是否外部 ID(boolean) - `indexed`: 是否索引(boolean) - `aggregatable`: 是否可聚合(boolean) - `aiPredictionField`: 是否 AI 预测字段(boolean) - `defaultValue`: 默认值(Object) - `picklistValues`: 选项列表值(PicklistEntry[]) - `referenceTo`: 引用对象列表(String[]) - `relationshipName`: 关系名称(String) **主要方法**: - `getName()`: 获取字段名称 - `getLabel()`: 获取字段标签 - `getType()`: 获取字段类型 - `isCreateable()`: 判断是否可创建 - `isUpdateable()`: 判断是否可更新 - `isNillable()`: 判断是否可为空 - `isCustom()`: 判断是否自定义字段 - `isUnique()`: 判断是否唯一 - `isExternalId()`: 判断是否外部 ID - `getPicklistValues()`: 获取选项列表值 - `getReferenceTo()`: 获取引用对象列表 **使用示例**: ```java DescribeSObjectResult describeResult = connection.describeSObject("Account"); for (Field field : describeResult.getFields()) { System.out.println("字段: " + field.getName()); System.out.println(" 标签: " + field.getLabel()); System.out.println(" 类型: " + field.getType()); System.out.println(" 可创建: " + field.isCreateable()); System.out.println(" 可更新: " + field.isUpdateable()); System.out.println(" 可为空: " + field.isNillable()); System.out.println(" 自定义: " + field.isCustom()); // 处理选项列表字段 if (field.getType() == SoapType.picklist && field.getPicklistValues() != null) { System.out.println(" 选项列表:"); for (PicklistEntry entry : field.getPicklistValues()) { System.out.println(" - " + entry.getLabel() + " (" + entry.getValue() + ")"); } } // 处理引用字段 if (field.getReferenceTo() != null && field.getReferenceTo().length > 0) { System.out.println(" 引用对象: " + String.join(", ", field.getReferenceTo())); } } ``` ## 使用场景 ### 1. 数据同步 - 从外部系统同步数据到 Salesforce - 从 Salesforce 同步数据到外部系统 - 双向数据同步 - 增量数据同步 ### 2. 数据集成 - 与其他系统集成 - 数据迁移 - 数据导入/导出 - 批量数据处理 ### 3. 自定义应用开发 - 构建自定义应用 - 实现业务逻辑 - 用户界面集成 - 自动化工作流 ### 4. 报表和分析 - 数据查询和报表 - 业务分析 - 数据可视化 - 决策支持 ### 5. 数据管理 - 数据维护 - 数据清理 - 数据归档 - 数据备份 ## SOQL 查询示例 ### 基本查询 ```java QueryResult result = connection.query( "SELECT Id, Name, Industry FROM Account" ); ``` ### 条件查询 ```java QueryResult result = connection.query( "SELECT Id, Name, Industry FROM Account WHERE Industry = 'Technology'" ); ``` ### 排序和限制 ```java QueryResult result = connection.query( "SELECT Id, Name, CreatedDate FROM Account ORDER BY CreatedDate DESC LIMIT 10" ); ``` ### 关联查询 ```java QueryResult result = connection.query( "SELECT Id, Name, (SELECT FirstName, LastName FROM Contacts) FROM Account" ); ``` ### 聚合查询 ```java QueryResult result = connection.query( "SELECT Industry, COUNT(Id) FROM Account GROUP BY Industry" ); ``` ## 注意事项 1. **API 限制**: 有 API 调用次数限制和并发限制 2. **查询限制**: SOQL 查询有记录数限制(通常为 50,000 条) 3. **批量操作**: 批量操作有大小限制(通常为 200 条记录) 4. **字段限制**: 查询和更新有字段数限制 5. **权限要求**: 需要适当的对象和字段权限 6. **会话管理**: 会话有超时时间,需要定期刷新 7. **错误处理**: 需要正确处理各种错误情况 8. **性能考虑**: 大量数据操作可能影响性能 9. **版本兼容性**: 不同版本的 Salesforce 可能有不同的 API 行为 10. **动态特性**: Partner API 是动态的,需要处理运行时类型 ## 错误处理 ### 常见错误类型 1. **INVALID_FIELD**: 字段不存在或无效 2. **INVALID_ID**: ID 无效 3. **MALFORMED_QUERY**: 查询语法错误 4. **INVALID_OPERATION**: 操作无效 5. **DUPLICATE_VALUE**: 值重复 6. **ENTITY_IS_DELETED**: 记录已删除 7. **INSUFFICIENT_ACCESS**: 权限不足 8. **INVALID_CROSS_REFERENCE_KEY**: 跨引用键无效 ### 错误处理示例 ```java try { SaveResult[] results = connection.create(new SObject[]{account}); for (SaveResult result : results) { if (!result.isSuccess()) { for (Error error : result.getErrors()) { System.out.println("错误代码: " + error.getStatusCode()); System.out.println("错误消息: " + error.getMessage()); System.out.println("字段: " + error.getFields()); } } } } catch (ConnectionException e) { System.out.println("连接错误: " + e.getMessage()); } catch (ApiFault e) { System.out.println("API 错误: " + e.getExceptionMessage()); } ``` ## 最佳实践 1. **使用批量操作**: 尽量使用批量操作减少 API 调用 2. **查询优化**: 只查询需要的字段,使用适当的过滤条件 3. **错误处理**: 实现完善的错误处理和重试机制 4. **会话管理**: 妥善管理会话,避免频繁登录 5. **性能监控**: 监控 API 调用性能和响应时间 6. **日志记录**: 记录 API 调用和错误信息 7. **测试**: 在生产环境前充分测试 8. **文档**: 记录 API 使用和集成逻辑 ## 相关文档 - [Salesforce Partner API 开发者指南](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/) - [Partner API 参考](https://developer.salesforce.com/docs/atlas.en-us.api_partner.meta/api_partner/index.htm) - [SOQL 和 SOSL 参考](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/) - [API 限制](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/limits.htm) ## 文件分类 ### 连接和认证 - Connector.java - 连接工厂类 - PartnerConnection.java - Partner API 连接类 - LoginResult.java - 登录结果 - SessionHeader_element.java - 会话头 - CallOptions_element.java - 调用选项 - QueryOptions_element.java - 查询选项 ### 数据操作 - Create_element.java - 创建请求 - CreateResponse_element.java - 创建响应 - Update_element.java - 更新请求 - UpdateResponse_element.java - 更新响应 - Delete_element.java - 删除请求 - DeleteResponse_element.java - 删除响应 - DeleteByExample_element.java - 按示例删除请求 - DeleteByExampleResponse_element.java - 按示例删除响应 - DeleteByExampleResult.java - 按示例删除结果 - Upsert_element.java - 更新或插入请求 - UpsertResponse_element.java - 更新或插入响应 - UpsertResult.java - 更新或插入结果 - Merge_element.java - 合并请求 - MergeResponse_element.java - 合并响应 - Undelete_element.java - 恢复请求 - UndeleteResponse_element.java - 恢复响应 - UndeleteResult.java - 恢复结果 - Retrieve_element.java - 检索请求 - RetrieveResponse_element.java - 检索响应 ### 查询和搜索 - Query_element.java - 查询请求 - QueryResponse_element.java - 查询响应 - QueryResult.java - 查询结果 - QueryAll_element.java - 查询所有请求 - QueryAllResponse_element.java - 查询所有响应 - QueryMore_element.java - 查询更多请求 - QueryMoreResponse_element.java - 查询更多响应 - Search_element.java - 搜索请求 - SearchResponse_element.java - 搜索响应 - SearchResult.java - 搜索结果 - SearchRecord.java - 搜索记录 - SearchRecordMetadata.java - 搜索记录元数据 - SearchResultsMetadata.java - 搜索结果元数据 - SearchSnippet.java - 搜索片段 - SearchStatus.java - 搜索状态 - SearchLayout.java - 搜索布局 - SearchLayoutResult.java - 搜索布局结果 - SearchLayouts_element.java - 搜索布局请求 - SearchLayoutsResponse_element.java - 搜索布局响应 - SearchScopeOrder.java - 搜索范围顺序 - SearchScopeOrder_element.java - 搜索范围顺序请求 - SearchScopeOrderResponse_element.java - 搜索范围顺序响应 - SearchScopeOrderResult.java - 搜索范围顺序结果 - SearchableEntity.java - 可搜索实体 - SearchableEntities_element.java - 可搜索实体请求 - SearchableEntitiesResponse_element.java - 可搜索实体响应 - SearchableEntityResult.java - 可搜索实体结果 ### 描述功能 - DescribeGlobal_element.java - 描述全局请求 - DescribeGlobalResponse_element.java - 描述全局响应 - DescribeGlobalResult.java - 描述全局结果 - DescribeGlobalSObjectResult.java - 描述全局对象结果 - DescribeSObject_element.java - 描述对象请求 - DescribeSObjectResponse_element.java - 描述对象响应 - DescribeSObjectResult.java - 描述对象结果 - DescribeSObjects_element.java - 描述多个对象请求 - DescribeSObjectsResponse_element.java - 描述多个对象响应 - DescribeNouns_element.java - 描述名词请求 - DescribeNounsResponse_element.java - 描述名词响应 - DescribeNounResult.java - 描述名词结果 ### 布局和标签页 - DescribeLayout_element.java - 描述布局请求 - DescribeLayoutResponse_element.java - 描述布局响应 - DescribeLayoutResult.java - 描述布局结果 - DescribeLayout.java - 布局描述 - DescribeLayoutRow.java - 布局行 - DescribeLayoutSection.java - 布局节 - DescribeLayoutItem.java - 布局项 - DescribeLayoutComponent.java - 布局组件 - DescribeLayoutButton.java - 布局按钮 - DescribeLayoutButtonSection.java - 布局按钮节 - DescribeLayoutSaveOption.java - 布局保存选项 - DescribeLayoutFeedFilter.java - 布局 Feed 过滤器 - DescribeLayoutFeedView.java - 布局 Feed 视图 - DescribeCompactLayouts_element.java - 描述紧凑布局请求 - DescribeCompactLayoutsResponse_element.java - 描述紧凑布局响应 - DescribeCompactLayoutsResult.java - 描述紧凑布局结果 - DescribeCompactLayout.java - 紧凑布局 - DescribePrimaryCompactLayouts_element.java - 描述主紧凑布局请求 - DescribePrimaryCompactLayoutsResponse_element.java - 描述主紧凑布局响应 - DescribeTabs_element.java - 描述标签页请求 - DescribeTabsResponse_element.java - 描述标签页响应 - DescribeTabSetResult.java - 描述标签集结果 - DescribeTab.java - 标签页描述 - DescribeAllTabs_element.java - 描述所有标签页请求 - DescribeAllTabsResponse_element.java - 描述所有标签页响应 ### 快速操作 - DescribeQuickActions_element.java - 描述快速操作请求 - DescribeQuickActionsResponse_element.java - 描述快速操作响应 - DescribeQuickActionResult.java - 描述快速操作结果 - DescribeQuickActionsForRecordType_element.java - 描述记录类型快速操作请求 - DescribeQuickActionsForRecordTypeResponse_element.java - 描述记录类型快速操作响应 - DescribeAvailableQuickActions_element.java - 描述可用快速操作请求 - DescribeAvailableQuickActionsResponse_element.java - 描述可用快速操作响应 - DescribeAvailableQuickActionResult.java - 描述可用快速操作结果 - DescribeQuickActionDefaultValue.java - 快速操作默认值 - DescribeQuickActionParameter.java - 快速操作参数 - DescribeQuickActionListItemResult.java - 快速操作列表项结果 - DescribeQuickActionListResult.java - 快速操作列表结果 - RetrieveQuickActionTemplates_element.java - 检索快速操作模板请求 - RetrieveQuickActionTemplatesResponse_element.java - 检索快速操作模板响应 - RetrieveMassQuickActionTemplates_element.java - 检索批量快速操作模板请求 - RetrieveMassQuickActionTemplatesResponse_element.java - 检索批量快速操作模板响应 ### 结果和错误 - SaveResult.java - 保存结果 - DeleteResult.java - 删除结果 - UndeleteResult.java - 恢复结果 - UpsertResult.java - 更新或插入结果 - Error.java - 错误信息 - StatusCode.java - 状态代码 - ExceptionCode.java - 异常代码 - ExtendedErrorDetails.java - 扩展错误详情 - DuplicateError.java - 重复错误 - DuplicateResult.java - 重复结果 - SendEmailError.java - 发送邮件错误 ### 高级功能 - ConvertLead_element.java - 转换线索请求 - ConvertLeadResponse_element.java - 转换线索响应 - EmptyRecycleBin_element.java - 清空回收站请求 - EmptyRecycleBinResponse_element.java - 清空回收站响应 - ProcessSubmitRequest_element.java - 处理提交请求 - ProcessSubmitRequestResponse_element.java - 处理提交请求响应 - ProcessSubmitRequestResult.java - 处理提交请求结果 - GetUserInfo_element.java - 获取用户信息请求 - GetUserInfoResponse_element.java - 获取用户信息响应 - GetServerTimestamp_element.java - 获取服务器时间戳请求 - GetServerTimestampResponse_element.java - 获取服务器时间戳响应 - ResetPassword_element.java - 重置密码请求 - ResetPasswordResponse_element.java - 重置密码响应 - ResetPasswordResult.java - 重置密码结果 - SetPassword_element.java - 设置密码请求 - SetPasswordResponse_element.java - 设置密码响应 - SetPasswordResult.java - 设置密码结果 - ChangeOwnPassword_element.java - 修改自己的密码请求 - ChangeOwnPasswordResponse_element.java - 修改自己的密码响应 - ChangeOwnPasswordResult.java - 修改自己的密码结果 ### 邮件功能 - SendEmail_element.java - 发送邮件请求 - SendEmailResponse_element.java - 发送邮件响应 - SendEmailResult.java - 发送邮件结果 - SendEmailMessage_element.java - 发送邮件消息请求 - SendEmailMessageResponse_element.java - 发送邮件消息响应 - SingleEmailMessage.java - 单封邮件消息 - MassEmailMessage.java - 批量邮件消息 - EmailFileAttachment.java - 邮件文件附件 - Email.java - 邮件 - EmailHeader_element.java - 邮件头 - RenderEmailTemplate_element.java - 渲染邮件模板请求 - RenderEmailTemplateResponse_element.java - 渲染邮件模板响应 - RenderEmailTemplateResult.java - 渲染邮件模板结果 - RenderStoredEmailTemplate_element.java - 渲染存储的邮件模板请求 - RenderStoredEmailTemplateResponse_element.java - 渲染存储的邮件模板响应 - RenderStoredEmailTemplateResult.java - 渲染存储的邮件模板结果 - RenderStoredEmailTemplateRequest.java - 渲染存储的邮件模板请求 - SendEmailOptOutPolicy.java - 发送邮件退出策略 ### SOAP 头部 - AllOrNoneHeader_element.java - 全有或全无头 - AllowFieldTruncationHeader_element.java - 允许字段截断头 - AssignmentRuleHeader_element.java - 分配规则头 - CallOptions_element.java - 调用选项头 - CurrencyConversionHeader_element.java - 货币转换头 - DebuggingHeader_element.java - 调试头 - DebuggingInfo_element.java - 调试信息 - DisableFeedTrackingHeader_element.java - 禁用 Feed 跟踪头 - DuplicateRuleHeader_element.java - 重复规则头 - EmailHeader_element.java - 邮件头 - LocaleOptions_element.java - 区域设置选项头 - MruHeader_element.java - 最近使用头 - PackageVersionHeader_element.java - 包版本头 - QueryOptions_element.java - 查询选项头 - SessionHeader_element.java - 会话头 - StreamingEnabledHeader_element.java - 流式启用头 - UserTerritoryDeleteHeader_element.java - 用户地域删除头 ### 数据分类 - DataCategory.java - 数据分类 - DataCategoryGroup.java - 数据分类组 - DataCategoryGroupSobjectTypePair.java - 数据分类组对象类型对 - DescribeDataCategoryGroups_element.java - 描述数据分类组请求 - DescribeDataCategoryGroupsResponse_element.java - 描述数据分类组响应 - DescribeDataCategoryGroupResult.java - 描述数据分类组结果 - DescribeDataCategoryGroupStructures_element.java - 描述数据分类组结构请求 - DescribeDataCategoryGroupStructuresResponse_element.java - 描述数据分类组结构响应 - DescribeDataCategoryGroupStructureResult.java - 描述数据分类组结构结果 - DescribeDataCategoryMappings_element.java - 描述数据分类映射请求 - DescribeDataCategoryMappingsResponse_element.java - 描述数据分类映射响应 - DescribeDataCategoryMappingResult.java - 描述数据分类映射结果 ### 应用菜单 - DescribeAppMenu_element.java - 描述应用菜单请求 - DescribeAppMenuResponse_element.java - 描述应用菜单响应 - DescribeAppMenuResult.java - 描述应用菜单结果 - DescribeAppMenuItem.java - 应用菜单项 ### 主题 - DescribeTheme_element.java - 描述主题请求 - DescribeThemeResponse_element.java - 描述主题响应 - DescribeThemeResult.java - 描述主题结果 - DescribeThemeItem.java - 主题项 - DescribeGlobalTheme_element.java - 描述全局主题请求 - DescribeGlobalThemeResponse_element.java - 描述全局主题响应 - DescribeGlobalTheme.java - 全局主题 ### 路径助手 - DescribePathAssistants_element.java - 描述路径助手请求 - DescribePathAssistantsResponse_element.java - 描述路径助手响应 - DescribePathAssistantsResult.java - 描述路径助手结果 - DescribePathAssistant.java - 路径助手 - DescribePathAssistantStep.java - 路径助手步骤 - DescribePathAssistantField.java - 路径助手字段 ### 软电话布局 - DescribeSoftphoneLayout_element.java - 描述软电话布局请求 - DescribeSoftphoneLayoutResponse_element.java - 描述软电话布局响应 - DescribeSoftphoneLayoutResult.java - 描述软电话布局结果 - DescribeSoftphoneLayoutItem.java - 软电话布局项 - DescribeSoftphoneLayoutSection.java - 软电话布局节 - DescribeSoftphoneLayoutInfoField.java - 软电话布局信息字段 - DescribeSoftphoneLayoutCallType.java - 软电话布局呼叫类型 - DescribeSoftphoneScreenPopOption.java - 软电话屏幕弹出选项 ### SOQL 列表视图 - DescribeSoqlListViews_element.java - 描述 SOQL 列表视图请求 - DescribeSoqlListViewsResponse_element.java - 描述 SOQL 列表视图响应 - DescribeSoqlListViewResult.java - 描述 SOQL 列表视图结果 - DescribeSoqlListView.java - SOQL 列表视图 - DescribeSoqlListViewParams.java - SOQL 列表视图参数 - DescribeSoqlListViewColumn.java - SOQL 列表视图列 - DescribeSoqlListViewOrderBy.java - SOQL 列表视图排序 - DescribeSoqlListViewFilter.java - SOQL 列表视图过滤器 - DescribeSoqlListViewScope.java - SOQL 列表视图范围 - DescribeSObjectListViews_element.java - 描述对象列表视图请求 - DescribeSObjectListViewsResponse_element.java - 描述对象列表视图响应 ### 知识设置 - DescribeKnowledgeSettings_element.java - 描述知识设置请求 - DescribeKnowledgeSettingsResponse_element.java - 描述知识设置响应 ### 批准布局 - DescribeApprovalLayout_element.java - 描述批准布局请求 - DescribeApprovalLayoutResponse_element.java - 描述批准布局响应 - DescribeApprovalLayoutResult.java - 描述批准布局结果 - DescribeApprovalLayout.java - 批准布局 ### Visualforce - DescribeVisualForce_element.java - 描述 Visualforce 请求 - DescribeVisualForceResponse_element.java - 描述 Visualforce 响应 - DescribeVisualForceResult.java - 描述 Visualforce 结果 - VisualforcePage.java - Visualforce 页面 ### 动作覆盖 - ActionOverride.java - 动作覆盖 - ActionOverrideType.java - 动作覆盖类型 ### 字段和关系 - Field.java - 字段 - ChildRelationship.java - 子关系 - PicklistEntry.java - 选项列表项 - FieldDefinition.java - 字段定义 ### SObject - sobject/SObject.java - SObject 基类 - sobject/SObject.java - SObject 实现 ### 故障 - fault/ApiFault.java - API 故障 - fault/ApiQueryFault.java - API 查询故障 - fault/InvalidIdFault.java - 无效 ID 故障 - fault/InvalidFieldFault.java - 无效字段故障 - fault/InvalidSObjectFault.java - 无效对象故障 - fault/MalformedQueryFault.java - 格式错误查询故障 - fault/MalformedSearchFault.java - 格式错误搜索故障 - fault/InvalidQueryLocatorFault.java - 无效查询定位器故障 - fault/LoginFault.java - 登录故障 - fault/InvalidNewPasswordFault.java - 无效新密码故障 - fault/InvalidOldPasswordFault.java - 无效旧密码故障 - fault/UnexpectedErrorFault.java - 意外错误故障 - fault/FaultCode.java - 故障代码 - fault/ExceptionCode.java - 异常代码 ### 其他类型 - Address.java - 地址 - Email.java - 邮件 - Article.java - 文章 - AnalyticsCloudComponent.java - Analytics Cloud 组件 - Canvas.java - Canvas - CustomLinkComponent.java - 自定义链接组件 - WebLinkPosition.java - Web 链接位置 - WebLinkType.java - Web 链接类型 - WebLinkWindowType.java - Web 链接窗口类型 - AppMenuType.java - 应用菜单类型 - CaseType.java - 案例类型 - AttachmentRetrievalOption.java - 附件检索选项 - DebugLevel.java - 调试级别 - DifferenceType.java - 差异类型 - ShareAccessLevel.java - 共享访问级别 - UiBehavior.java - UI 行为 - TabOrderType.java - 标签页顺序类型 - SoapType.java - SOAP 类型 - StringList.java - 字符串列表 - SimpleNameObjectValuePair.java - 简单名称对象值对 - AdditionalInformationMap.java - 附加信息映射 - ChangeEventHeader.java - 变更事件头 - ChangeEventType.java - 变更事件类型 ### SOQL 相关 - SoqlCondition.java - SOQL 条件 - SoqlConditionGroup.java - SOQL 条件组 - SoqlWhereCondition.java - SOQL WHERE 条件 - SoqlSubQueryCondition.java - SOQL 子查询条件 - SoqlNotCondition.java - SOQL NOT 条件 - SoqlConjunction.java - SOQL 连接词 - SoqlOperator.java - SOQL 操作符 - StartsWith.java - 以...开始 **注意**: 该模块共包含 687 个 Java 文件,涵盖了 Salesforce Partner API 的所有功能和元数据类型。