RallyRestAPI使用变更集创建生成

RallyRestAPI使用变更集创建生成,rally,Rally,我正在创建拉力赛建造记录,作为TeamCity拉力赛集成的一部分,但在将建造与变更集关联时存在问题 我找到了一组与特定条件匹配的相关变更集,并将它们放在字符串数组中。然后我创建一个JsonArray对象,将这些“ref”字符串作为JsonPrimatives添加到数组中,将数组添加到我的CREATEJSON对象中,并将其添加到Rally中 但是,所发生的情况是创建了构建,但结果有一个空的变更集数组 我已尝试在createRequest中包含变更集,并执行updateRequest,但在这两种情况

我正在创建拉力赛建造记录,作为TeamCity拉力赛集成的一部分,但在将建造与变更集关联时存在问题

我找到了一组与特定条件匹配的相关变更集,并将它们放在字符串数组中。然后我创建一个JsonArray对象,将这些“ref”字符串作为JsonPrimatives添加到数组中,将数组添加到我的CREATEJSON对象中,并将其添加到Rally中

但是,所发生的情况是创建了构建,但结果有一个空的变更集数组

我已尝试在createRequest中包含变更集,并执行updateRequest,但在这两种情况下,响应都是成功的,没有报告错误或警告,并且变更集数组返回为null,重新查询会按预期显示所有其他数据,但变更集数组为空

这是代码

JsonObject obj = new JsonObject();
obj.addProperty("Workspace", def.getWorkspace().getRef());
obj.addProperty("Duration",1.05);
obj.addProperty("Message", "Master 4683 Success");
obj.addProperty("Start", isoFormat.format(new Date()));
obj.addProperty("Status","SUCCESS");
obj.addProperty("Number","4683");
obj.addProperty("Uri", "http://");
obj.addProperty("BuildDefinition",def.getRef());

// changeSets is a ArrayList<String> of "_ref" strings of VALID changesets references. 
if (changeSets != null && changeSets.size() > 0) {
    JsonArray changeSetList = new JsonArray();
    for (String id : changeSets) {
        changeSetList.add(new JsonPrimitive(id));
    }
    obj.add("Changesets", changeSetList);
}

String ref = connector.Create("Build",obj);
connector.Delete(ref, null);
JsonObject obj=新的JsonObject();
addProperty(“Workspace”,def.getWorkspace().getRef());
obj.addProperty(“期限”,1.05);
对象addProperty(“消息”,“主4683成功”);
obj.addProperty(“开始”,isoFormat.format(new Date());
对象addProperty(“状态”、“成功”);
对象addProperty(“编号”、“4683”);
obj.addProperty(“Uri”、“http:/”);
addProperty(“BuildDefinition”,def.getRef());
//变更集是有效变更集引用的“_ref”字符串的数组列表。
if(changeSets!=null&&changeSets.size()>0){
JsonArray changeSetList=新的JsonArray();
用于(字符串id:变更集){
add(新的JsonPrimitive(id));
}
对象添加(“变更集”,变更集列表);
}
String ref=connector.Create(“Build”,obj);
connector.Delete(ref,null);

有什么想法吗?

我的想法是,不是用JsonPrimitive只包含ref的值来填充JsonArray,而是需要一个具有{“\u ref”,“/changeset/12345678910.js”}键/值对的JsonObject。即,做出类似于以下内容的更改:

// changeSets is a ArrayList<String> of "_ref" strings of VALID changesets references. 
if (changeSets != null && changeSets.size() > 0) {
    JsonArray changeSetList = new JsonArray();
    for (String id : changeSets) {
        JsonObject thisChangeset = new JsonObject();
        thisChangeset.addProperty("_ref", id);
        changeSetList.add(thisChangeset);
    }
    obj.add("Changesets", changeSetList);
}
//变更集是有效变更集引用的“\u ref”字符串的数组列表。
if(changeSets!=null&&changeSets.size()>0){
JsonArray changeSetList=新的JsonArray();
用于(字符串id:变更集){
JsonObject thisChangeset=新的JsonObject();
thisChangeset.addProperty(“\u ref”,id);
添加(此变更集);
}
对象添加(“变更集”,变更集列表);
}

我相信您的代码应该能按预期工作。

Hi Mark,我使用了JSonPrimative,因为JSon库不允许向JsonArray添加字符串。要做到这一点,它必须是一个JSonPrimative。我按照上面的建议进行了尝试,向JSonArray中添加了一个JsonObject(键/值对),并将JSonArray添加到要创建的对象中,但这会导致API调用中出现一个错误,文本为“约束冲突:约束冲突”。我知道,当我在我的C#importer(附加到测试用例的TestSteps)中创建类似链接时,我只是添加了一个引用数组作为字符串,而不是JSONObject(键/值对)。我的答案中的示例包含一个输入错误-它应该说
addProperty
,而不是
setProperty
,但我肯定你发现了这一点。我已经编辑了要更新的答案。JsonObject的键/值对是必需的,因为序列化程序希望有一个“\u ref”属性。关于约束冲突的投诉可能意味着Rally服务器端的请求本身的性质存在非法内容(例如,缺少/无效必填字段)。检查CreateRequest中的完整错误和警告集合可能会提供有关约束问题性质的更好数据。我知道带有变更集ref键/值对的JsonObject可以正常工作,因为我已经成功地对它进行了测试,并最终在Rally中生成了一个新的包含相关变更集的版本。您可以在这里找到我的工作示例代码:谢谢mark,我将再看看您的示例。我确实检查了create命令的完整错误响应,唯一的信息是上面的文本。谢谢Mark,找到了问题。我的列表中有一个重复的引用,这导致了问题。变更集列表必须具有唯一的值(这很有意义)。不幸的是,错误响应并不是特别有用,但您确实是。