如何通过Java Rally Rest API获取缺陷的完整Discussion对象?
解决Rally API获取缺陷时Discussion仅返回引用的问题
我完全懂你的困扰——批量拉取几千个缺陷时,Discussion字段只给个集合引用URL,要是逐个去查讨论内容,效率低到没法用。下面直接给你能一次性拿到完整Discussion内容的解决方案:
问题根源
Rally的REST API默认不会自动展开集合类型字段(比如Discussion对应的ConversationPost集合),只会返回集合的元数据(引用链接、元素计数)。要拿到集合里的实际内容,必须在Fetch配置里明确指定要获取的集合元素属性。
具体修改方案
你只需要调整Fetch的配置,通过嵌套Fetch对象或者点语法,把Discussion集合里需要的属性列出来,API就会把讨论内容直接嵌入到返回的缺陷JSON中,不用再单独发请求。
方法1:用嵌套Fetch对象(可读性更好)
// 替换你原来的Fetch配置 defects.setFetch(new Fetch("FormattedID", "Resolution") // 指定要获取的Discussion集合元素的具体属性 .add("Discussion", new Fetch("Author", "Text", "CreationDate", "FormattedID", "_type")));
方法2:用点语法(写法更简洁)
defects.setFetch(new Fetch( "FormattedID", "Resolution", "Discussion.Author", "Discussion.Text", "Discussion.CreationDate", "Discussion.FormattedID" ));
修改后的完整代码片段
把原来的Fetch部分替换后,你的try块代码会变成这样:
try{ QueryRequest defects = new QueryRequest("defect"); // 修改后的Fetch配置,直接拉取Discussion的实际内容 defects.setFetch(new Fetch("FormattedID", "Resolution") .add("Discussion", new Fetch("Author", "Text", "CreationDate", "FormattedID"))); defects.setQueryFilter(new QueryFilter("Resolution","=","Configuration Change")); defects.setPageSize(5000); defects.setLimit(5000); QueryResponse queryResponse = restApi.query(defects); if(queryResponse.wasSuccessful()){ System.out.println(String.format("\nTotal results: %d",queryResponse.getTotalResultCount())); for(JsonElement result: queryResponse.getResults()){ JsonObject defect = result.getAsJsonObject(); System.out.println(defect); // 现在可以直接访问Discussion的内容数组了 JsonArray discussions = defect.getAsJsonObject("Discussion").getAsJsonArray("Results"); for(JsonElement post : discussions){ JsonObject conversationPost = post.getAsJsonObject(); System.out.println(" 讨论内容:" + conversationPost.get("Text").getAsString()); System.out.println(" 作者:" + conversationPost.getAsJsonObject("Author").get("DisplayName").getAsString()); } } }else{ System.err.print("The following errors occured: "); for(String err: queryResponse.getErrors()){ System.err.println("\t" + err); } } }finally{ restApi.close(); }
修改后的返回结果示例
现在Discussion字段会包含实际的讨论内容数组,而不是仅返回引用:
{ "_rallyAPIMajor":"2", "_rallyAPIMinor":"0", "_ref":"https://rally1.rallydev.com/slm/webservice/v2.0/defect/30023232168", "FormattedID":"DE332322", "Resolution":"Configuration Change", "Discussion":{ "Count":2, "Results":[ { "_type":"ConversationPost", "Author":{"DisplayName":"John Doe", "_ref":"..."}, "Text":"这个缺陷需要调整配置参数", "CreationDate":"2024-05-20T12:34:56Z" }, { "_type":"ConversationPost", "Author":{"DisplayName":"Jane Smith", "_ref":"..."}, "Text":"已完成配置修改,验证通过", "CreationDate":"2024-05-21T09:12:34Z" } ] }, "_type":"Defect" }
小提示
- 别一次性请求太多嵌套属性,避免返回数据过大拖慢性能,只选你实际需要的字段(比如只拿Author的DisplayName,而不是所有属性)。
- 你设置的
PageSize=5000已经符合Rally API的上限,批量拉取时不用调整这个参数。
内容的提问来源于stack exchange,提问作者jesric1029
相关产品推荐
相关产品推荐

