我们正在尝试将项目迁移从一个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美国/洛杉矶
但是重要的一点是,当尝试迁移项目及其相关属性(如发布/迭代等)和相同的Rally工作区时,上面的代码就可以了。
UPDATE1:
在分析问题时,我做了以下观察 -
我正在尝试创建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;
}
由于未传递我们尝试创建项目组合项的工作空间的对象ID,因此发生了“未知类型”错误。因此,在修改createInRally函数以包含工作空间对象id之后,我们能够创建计划组合项。修改后的createInRally函数如下所示 -
CreateRequest createRequest = new CreateRequest(query, object);
createRequest.addParam("workspace", "/workspace/1333333333");
CreateResponse createResponse = restApi.create(createRequest);
return createResponse;
所以这肯定是Web服务api中的一个错误。您永远不应该使用未处理的nullpointer获得500个响应。我最初的猜测是,当你创建新对象时,它上面的某个字段仍然引用旧工作区中的对象,当我们尝试正确连接所有关联时,它无法读取新工作区中的其中一个对象。您能否提供一些有关您要发送的实际对象的更多信息?具体而言,您包括哪些对象关系(在新工作区中可能无效)?