【问题标题】:Create BE Initiative, BE Feature and CPM Feature using Rally Rest Client in Java使用 Java 中的 Rally Rest Client 创建 BE Initiative、BE Feature 和 CPM Feature
【发布时间】:2017-12-05 19:19:03
【问题描述】:

我们正在尝试将项目从一个 Rally 工作区迁移到另一个工作区。一切似乎都运行良好,就像我们能够将项目和相关的发布/迭代/用户故事/任务从一个工作区迁移到另一个工作区一样。 但是在尝试迁移 BE Initiative/BE Feature/CPM Feature 时,我们得到了一些与 Null Pointer 异常相关的异常,但我们在 Response 中得到的错误似乎并没有提供太多信息。

代码示例是 -

    String oldProjectObjectId = "12345";
    String  newProjectObjectId = "67890";

    String oldRallyWorkspaceObjectId = "32145";
    String newRallyWorkspaceObjectId = "67894";
    QueryResponse beInitiativeResponse = queryRally("portfolioitem/beinitiative", "/project/"+this.oldProjectObjectId, "/workspace/"+this.oldRallyWorkspaceObjectId);

    int beInitiativeCount = beInitiativeResponse.getTotalResultCount();

    if(beInitiativeCount >0){

        JsonArray initiativeArray = beInitiativeResponse.getResults();

        for(int i=0; i< initiativeArray.size();i++){        

            JsonObject beInitiativeObject = initiativeArray.get(i).getAsJsonObject();

            String oldBeInitiativeObjectId = beInitiativeObject.get("ObjectID").getAsString();
            String oldBeInitiativeName = beInitiativeObject.get("_refObjectName").getAsString();

            String owner = getObjectId(beInitiativeObject, "Owner");

            JsonObject BeInitiativeCreateObject = getJsonObject(oldBeInitiativeName, "/project/"+this.newProjectObjectId, "/workspace/"+this.newRallyWorkspaceObjectId, owner);
            CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/beinitiative", BeInitiativeCreateObject);

            if(beInitiativeCreateResponse.wasSuccessful()){
                String newBeInitiativeObjectId = beInitiativeCreateResponse.getObject().get("ObjectID").getAsString();

                String mapKey = oldBeInitiativeObjectId;
                String mapValue= newBeInitiativeObjectId;
                this.beInitiativesHashMap.put(mapKey, mapValue);
            }
            else{   
                String[] errorList;
                errorList = beInitiativeCreateResponse.getErrors();
                for (int j = 0; j < errorList.length; j++) {
                    System.out.println(errorList[j]);
                }
            }

        }
    }

queryRally 和 createInRally 函数使用 Rally rest 客户端 来获取和创建所需的项目和相关属性,如发布、迭代等。

在执行CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/beinitiative", BeInitiativeCreateObject); 后,当它尝试执行if(beInitiativeCreateResponse.wasSuccessful()) 时,它转而进入else 块,从而打印出下面提到的错误。

发生了意外错误。

我们已记录此错误并将开始调查。同时,如果您想与我们的支持团队交谈,请参考以下信息:

java.lang.NullPointerException

2017-12-05 11:01 AM PST America/洛杉矶

重要点是在尝试迁移项目时,它的相关属性(如发布/迭代等)使用相同的 Rally 工作区,上面的代码工作得很好。

更新1:

在分析问题时,我做了以下观察 -

我尝试在其中创建 BeInitiative 的工作区在 Portfolio items 下拉列表中没有 BEinitiative、Be Feature、CPM Feature 选项。相反,它具有主题、倡议和功能选项。 因此,我认为我遇到了前面提到的错误。现在我对代码进行了以下更改。

CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/theme", themeCreateObject);

所以现在我没有创建 BEInitiative,而是尝试仅在新工作区中创建主题,但出现以下错误 -

请求的类型名称“/portfolioitem/theme”未知。

我传递给 CreateResponse 函数的对象是 -

{"Name":"xyz","Project":"/project/1804","Workspace":"/workspace/139"}

createInRally 函数的代码也如下所述 -

public CreateResponse createInRally( String query, JsonObject object) throws IOException{

    CreateRequest createRequest = new CreateRequest(query, object);

    CreateResponse createResponse = restApi.create(createRequest);

    return createResponse;
}

【问题讨论】:

  • 你能再具体一点吗?上面哪一行因该错误而失败?
  • 很抱歉没有在问题本身中指出这一点。当尝试执行if(beInitiativeCreateResponse.wasSuccessful()) 时,它会阻塞并因此执行else{ String[] errorList; errorList = beInitiativeCreateResponse.getErrors(); for (int j = 0; j &lt; errorList.length; j++) { System.out.println(errorList[j]); }}
  • 在问题中也更新了同样的内容。
  • @KyleMorse 请您调查一下这个问题,因为我已经用信息更新了它。必需的。谢谢

标签: java rest rally


【解决方案1】:

未知类型错误是由于未传递我们试图在其中创建投资组合项的工作区的对象 ID 而发生的。 因此,在修改 createInRally 函数以包含工作区对象 ID 后,我们能够创建倡议投资组合项目。 修改后的createInRally函数如下图-

    CreateRequest createRequest = new CreateRequest(query, object);

    createRequest.addParam("workspace", "/workspace/1333333333");

    CreateResponse createResponse = restApi.create(createRequest);

    return createResponse;

【讨论】:

    【解决方案2】:

    所以这绝对是 Web 服务 api 中的错误。您永远不应该使用未处理的空指针获得 500 个响应。我最初的猜测是,当您创建新对象时,其上的某些字段仍在引用旧工作区中的对象,并且当我们尝试正确连接所有关联时,它无法读取新工作区中的这些对象之一.您能否提供更多有关您要发送以创建的实际对象的信息?具体包括哪些对象关系(在新工作区中可能无效)?

    【讨论】:

    • 感谢您的回答。我已使用所需信息更新了问题。在更新 1 标题下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多