You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:52:54