如何使用纯Java API在RTC流中定位变更集?代码报错求助
locateChangeSets 抛出IllegalArgumentException的问题 你遇到的这个IllegalArgumentException是RTC SCM API在参数校验不通过时抛出的,咱们结合你的代码一步步排查可能的问题:
首先先还原你的代码和异常信息:
你的代码
List<IChangeSetHandle> changeSetHandle = convertToChangeSetHandles( change.getItemId().getUuidValue().toString()); IWorkspaceSearchCriteria wsSearchCriteria1 = IWorkspaceSearchCriteria.FACTORY.newInstance(); wsSearchCriteria1.setKind(IWorkspaceSearchCriteria.WORKSPACES); wsSearchCriteria1.setExactName(connectedStreamNew.getName()); List<IWorkspaceHandle> streamHandleList1 = workspaceManager.findWorkspaces(wsSearchCriteria1, Integer.MAX_VALUE, monitor); ILocateChangeSetsSearchCriteria scope = ILocateChangeSetsSearchCriteria.FACTORY .create(changeSetHandle, streamHandleList1, Collections.EMPTY_LIST, Collections.EMPTY_LIST); IWorkspaceManager workspaceManager1 = SCMPlatform.getWorkspaceManager(repoCasa); List<ILocateChangeSetsSearchResult> result = workspaceManager1.locateChangeSets(scope, monitor);
抛出的异常
java.lang.IllegalArgumentException at com.ibm.team.scm.client.internal.WorkspaceManager.locateChangeSets(WorkspaceManager.java:252)
可能的问题点及修复方案
1. 重复创建的WorkspaceManager实例不匹配
你代码里先后创建了两个IWorkspaceManager:workspaceManager(用来查询流)和workspaceManager1(用来定位变更集)。如果这两个实例关联的仓库(repoCasa)不是同一个,或者句柄是由不同的管理器创建的,API会因为无法识别句柄而抛出参数异常。
修复方案:直接复用之前的workspaceManager实例,删掉重复创建的代码:
// 移除这行重复创建的代码 // IWorkspaceManager workspaceManager1 = SCMPlatform.getWorkspaceManager(repoCasa); // 直接用之前的workspaceManager调用方法 List<ILocateChangeSetsSearchResult> result = workspaceManager.locateChangeSets(scope, monitor);
2. 搜索条件Scope的参数顺序错误
RTC的ILocateChangeSetsSearchCriteria.FACTORY.create方法参数顺序是:create(List<IChangeSetHandle> changeSets, List<IWorkspaceHandle> sourceWorkspaces, List<IWorkspaceHandle> targetWorkspaces, List<String> properties)
你现在把要查询的流streamHandleList1放在了源工作区的位置,但如果你的需求是查找变更集在目标流中的状态,应该把它放在第三个参数(目标工作区)的位置,而源工作区传空列表。
修复方案:调整参数顺序:
ILocateChangeSetsSearchCriteria scope = ILocateChangeSetsSearchCriteria.FACTORY .create(changeSetHandle, Collections.EMPTY_LIST, streamHandleList1, Collections.EMPTY_LIST);
3. 输入参数为空或无效
API对空的句柄列表通常会严格校验,你需要确保:
changeSetHandle列表不为空,且里面的IChangeSetHandle是有效的(比如UUID转换正确)streamHandleList1不为空(即findWorkspaces确实找到了对应名称的流)
修复方案:在调用locateChangeSets前添加空值检查:
// 检查变更集句柄列表 if (changeSetHandle == null || changeSetHandle.isEmpty()) { throw new IllegalArgumentException("变更集句柄列表不能为空或无效"); } // 检查流句柄列表 if (streamHandleList1 == null || streamHandleList1.isEmpty()) { throw new IllegalArgumentException("未找到指定名称的流,请确认流名称是否正确"); }
4. ProgressMonitor参数无效
如果传入的monitor是null,部分RTC API方法会抛出参数异常。即使不需要监控进度,也应该传入一个空实现。
修复方案:使用NullProgressMonitor代替可能的null值:
import org.eclipse.core.runtime.NullProgressMonitor; // 调用时传入空进度监控 List<ILocateChangeSetsSearchResult> result = workspaceManager.locateChangeSets(scope, new NullProgressMonitor());
排查步骤建议
- 先验证
streamHandleList1是否能正确获取到流句柄,打印列表大小确认 - 检查
convertToChangeSetHandles方法返回的列表是否包含有效的变更集句柄 - 统一使用同一个
WorkspaceManager实例 - 调整搜索条件的参数顺序,匹配你的实际查询需求
内容的提问来源于stack exchange,提问作者Rinkal Garg

