在 Java 中使用 Rally Rest Client 创建 BE Initiative、BE Feature 和 CPM Feature
Create BE Initiative, BE Feature and CPM Feature using Rally Rest Client in Java
我们正在尝试自动将项目从一个 Rally 工作区迁移到另一个工作区。一切似乎都运行良好,就像我们能够将项目和相关 releases/iterations/userstories/tasks 从一个工作区迁移到另一个工作区一样。
但是在尝试迁移 BE Initiative/BE Feature/CPM 功能时,我们遇到了一些与空指针异常相关的异常,但我们在响应中遇到的错误似乎没有提供太多信息。
代码示例是 -
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 client 来获取和创建所需的项目和相关属性,如发布、迭代等。
在尝试执行 if(beInitiativeCreateResponse.wasSuccessful())
时执行 CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/beinitiative", BeInitiativeCreateObject);
之后,它会转到 else 块 并因此打印下面提到的错误。
An unexpected error has occurred.
We have recorded this error and will begin to investigate it. In the meantime, if you would like to speak with our Support Team, please reference the information below:
java.lang.NullPointerException
2017-12-05 11:01 AM PST America/Los_Angeles
但是 重要 点是在尝试迁移项目时,它的相关属性如 release/iterations 等。使用相同的 Rally 工作区,上面的代码片段工作得很好.
更新1:
在分析问题时,我做了以下观察 -
我尝试在其中创建 BeInitiative 的工作区在投资组合项目下拉列表中没有 BEinitiative、Be Feature、CPM Feature 选项。相反,它有主题、倡议和功能选项。
因此,我想我遇到了前面提到的错误。现在我对代码进行了以下更改。
CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/theme", themeCreateObject);
所以现在我没有创建 BEInitiative,而是尝试仅在新工作区中创建主题,但出现以下错误 -
Requested type name \"/portfolioitem/theme\" is unknown.
我传递给 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;
}
所以这绝对是网络服务中的一个错误api。你永远不应该得到 500 个带有未处理的空指针的响应。我最初的猜测是,当您创建新对象时,它上面的某个字段仍然引用旧工作区中的对象,并且当我们尝试正确连接所有关联时,它无法读取新工作区中的这些对象之一.您能否提供更多有关您要发送以创建的实际对象的信息?具体来说,您包括哪些对象关系(在新工作区中可能无效)?
未知类型 错误是由于未传递我们试图在其中创建投资组合项目的工作区的对象 ID 而发生的。
因此,在修改 createInRally 函数以包含工作区对象 ID 之后,我们能够创建计划组合项目。
修改后的createInRally函数如下图-
CreateRequest createRequest = new CreateRequest(query, object);
createRequest.addParam("workspace", "/workspace/1333333333");
CreateResponse createResponse = restApi.create(createRequest);
return createResponse;
我们正在尝试自动将项目从一个 Rally 工作区迁移到另一个工作区。一切似乎都运行良好,就像我们能够将项目和相关 releases/iterations/userstories/tasks 从一个工作区迁移到另一个工作区一样。 但是在尝试迁移 BE Initiative/BE Feature/CPM 功能时,我们遇到了一些与空指针异常相关的异常,但我们在响应中遇到的错误似乎没有提供太多信息。
代码示例是 -
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 client 来获取和创建所需的项目和相关属性,如发布、迭代等。
在尝试执行 if(beInitiativeCreateResponse.wasSuccessful())
时执行 CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/beinitiative", BeInitiativeCreateObject);
之后,它会转到 else 块 并因此打印下面提到的错误。
An unexpected error has occurred.
We have recorded this error and will begin to investigate it. In the meantime, if you would like to speak with our Support Team, please reference the information below:
java.lang.NullPointerException
2017-12-05 11:01 AM PST America/Los_Angeles
但是 重要 点是在尝试迁移项目时,它的相关属性如 release/iterations 等。使用相同的 Rally 工作区,上面的代码片段工作得很好.
更新1:
在分析问题时,我做了以下观察 -
我尝试在其中创建 BeInitiative 的工作区在投资组合项目下拉列表中没有 BEinitiative、Be Feature、CPM Feature 选项。相反,它有主题、倡议和功能选项。 因此,我想我遇到了前面提到的错误。现在我对代码进行了以下更改。
CreateResponse beInitiativeCreateResponse = createInRally("portfolioitem/theme", themeCreateObject);
所以现在我没有创建 BEInitiative,而是尝试仅在新工作区中创建主题,但出现以下错误 -
Requested type name \"/portfolioitem/theme\" is unknown.
我传递给 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;
}
所以这绝对是网络服务中的一个错误api。你永远不应该得到 500 个带有未处理的空指针的响应。我最初的猜测是,当您创建新对象时,它上面的某个字段仍然引用旧工作区中的对象,并且当我们尝试正确连接所有关联时,它无法读取新工作区中的这些对象之一.您能否提供更多有关您要发送以创建的实际对象的信息?具体来说,您包括哪些对象关系(在新工作区中可能无效)?
未知类型 错误是由于未传递我们试图在其中创建投资组合项目的工作区的对象 ID 而发生的。 因此,在修改 createInRally 函数以包含工作区对象 ID 之后,我们能够创建计划组合项目。 修改后的createInRally函数如下图-
CreateRequest createRequest = new CreateRequest(query, object);
createRequest.addParam("workspace", "/workspace/1333333333");
CreateResponse createResponse = restApi.create(createRequest);
return createResponse;