2013-05-02 21 views
0

我創建的Rally構建記錄是TeamCity集成Rally集成的一部分,但存在將構建與ChangeSet關聯的問題。RallyRestAPI使用ChangeSet創建構建

我找到一組相關的ChangeSets,它們匹配一個特定的條件並將它們放在一個String數組中。然後創建一個JsonArray對象,將這些「_ref」字符串作爲JsonPrimatives添加到數組中,將該數組添加到我創建的Json對象並將其添加到Rally中。

然而,會發生什麼是構建創建,但結果有一個空的Changeset數組。

我已經嘗試在createRequest中包含更改集,並且還在執行updateRequest,但在兩種情況下響應都是成功的,沒有報告錯誤或警告,並且Changeset數組返回爲空,並且重新查詢顯示所有其他數據如預期的那樣,但changeSet數組是空的。

這是代碼。

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); 

任何想法?

回答

1

我的想法是,而不是用JsonPrimitive的只有ref的值填充你的JsonArray,你實際上需要一個帶有鍵值對{「_ref」,「/ changeset/12345678910.js」}的JsonObject。 I.E.請進行類似如下的更改:

// 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); 
} 

而且我相信您的代碼應該按預期工作。

+0

嗨馬克 我使用JSonPrimative作爲JSon庫不允許將字符串添加到JsonArray。它需要成爲JSonPrimative才能做到這一點。 我按照上面的建議嘗試過,向JSonArray添加JsonObject(鍵/值對),並將JSonArray添加到要創建的對象,但它會導致API調用帶有文本「約束違例:約束違例」 。 我知道在C#導入器中創建類似的鏈接時(TestSteps附加到TestCases中)我只是添加了一個引用數組作爲字符串而不是JsonObjects(鍵/值對)。 – trevleyb 2013-05-05 19:52:18

+0

我答案中的例子包含一個錯字 - 它應該說'addProperty'而不是'setProperty',但我相信你發現了這個錯誤。我編輯了更新的答案。 JsonObject的鍵/值對將被需要,因爲序列化器將期望具有「_ref」屬性。關於約束違規的投訴可能意味着在拉力賽服務器端有關於請求本身的性質是非法的(例如,缺失/無效的必填字段)。 – 2013-05-05 21:52:59

+0

從CreateRequest中檢查完整的Errors和Warnings Collection可能會提供更好的關於約束問題性質的數據。我知道具有Changeset引用鍵/值對的JsonObject可以在我成功測試它的情況下工作,並最終以帶有關聯的變更集的新建版集成。你可以在這裏找到我的工作示例代碼:https://gist.github.com/markwilliams970/5511534 – 2013-05-05 21:54:30