Jira REST API设置测试计划测试用例自定义字段报错求助
解决JIRA测试计划字段写入CannotTransformValueException问题
问题核心:你读取到的org.codehaus.jettison.json.JSONArray类型,JIRA REST Client的ValueTransformerManager没有对应的转换器,无法直接用于字段赋值。测试计划的测试用例字段(customfield_17473)本质是多值问题引用字段,需要转换成客户端能识别的结构。
解决方案
将JSONArray中的测试用例Key转换成包含key字段的Map集合,或者直接使用JIRA REST Client提供的IssueRef对象,再传入setFieldValue方法。
修改后的代码示例
import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import com.atlassian.jira.rest.client.api.domain.IssueRef; import java.util.ArrayList; import java.util.List; public void updateIssue(String issueKey, String fieldId, Object fieldValue) { Object transformedValue = fieldValue; if (fieldValue instanceof JSONArray) { JSONArray issueKeysArray = (JSONArray) fieldValue; List<IssueRef> issueRefs = new ArrayList<>(); try { for (int i = 0; i < issueKeysArray.length(); i++) { String testCaseKey = issueKeysArray.getString(i); // 用IssueRef封装测试用例Key,JIRA客户端能识别该类型 issueRefs.add(new IssueRef(null, testCaseKey, null)); } transformedValue = issueRefs; } catch (JSONException e) { throw new RuntimeException("解析测试用例Key失败", e); } } IssueInput input = new IssueInputBuilder() .setFieldValue(fieldId, transformedValue) .build(); restClient.getIssueClient() .updateIssue(issueKey, input) .claim(); }
如果不想依赖IssueRef,也可以用Map结构替代:
// 替换上面的IssueRef部分 import java.util.HashMap; import java.util.Map; List<Map<String, Object>> issueRefs = new ArrayList<>(); // ... Map<String, Object> issueMap = new HashMap<>(); issueMap.put("key", testCaseKey); issueRefs.add(issueMap);
原理说明
JIRA REST API接受的问题引用格式是包含key(或id)字段的JSON对象数组,而JIRA REST Client的转换器只识别特定的Java类型(如IssueRef、List<Map<String, Object>>),无法直接处理第三方JSON库的JSONArray对象。通过转换为客户端支持的类型,就能绕过转换器不兼容的问题。
内容的提问来源于stack exchange,提问作者Jefe infiltrado
相关产品推荐
相关产品推荐

