我们正在尝试自动将项目从一个拉力工作区迁移到另一个工作区。一切似乎都很好,就像我们能够将项目和相关的版本/迭代/用户故事/任务从一个工作区迁移到另一个工作区一样。但是,在尝试迁移BE倡议/BE功能/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]);
}
}
}
}
queryraly和createinraly函数使用Rally rest客户端获取并创建所需的项目和相关属性,如发布、迭代等。
执行CreateResponse beInitiativeCreateResponse=createInraly(“portfolioitem/beinitiative”,BeInitiativeCreateObject)后
当它试图执行
if(beInitiativeCreateResponse.wassuctiful())
时,它将执行else块,从而打印下面提到的错误。
发生了意外错误
我们已经记录了这个错误,并将开始调查它。同时,如果您想与我们的支持团队交谈,请参考以下信息:
java。lang.NullPointerException 2017-12-05美国太平洋标准时间上午11:01洛杉矶
但重要的一点是,当尝试迁移项目及其相关属性(如发布/迭代等)时,在相同的工作空间中,上述代码可以正常工作。
更新:
在分析这个问题时,我提出了以下意见:
我试图创建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"}
CreateInraly函数的代码如下所述-
public CreateResponse createInRally( String query, JsonObject object) throws IOException{
CreateRequest createRequest = new CreateRequest(query, object);
CreateResponse createResponse = restApi.create(createRequest);
return createResponse;
}
所以这肯定是web服务api中的一个错误。对于未经处理的空指针,您永远不会得到500个响应。我最初的猜测是,当您创建新对象时,其中的某个字段仍在引用旧工作区中的一个对象,而当我们尝试正确连接所有关联时,它无法读取新工作区中的其中一个对象。你能提供更多关于你要创建的实际对象的信息吗?具体来说,您包括哪些对象关系(在新工作区中可能无效)?
未知类型错误是由于没有传递我们试图在其中创建组合项目的工作区对象标识而发生的。因此,在修改createInRally函数以包括工作区对象标识后,我们能够创建初始组合项目。修改后的createInRally函数如下所示-
CreateRequest createRequest = new CreateRequest(query, object);
createRequest.addParam("workspace", "/workspace/1333333333");
CreateResponse createResponse = restApi.create(createRequest);
return createResponse;
客户端提供了几种失败处理的方式。 当客户端连接服务器并且进行调用的时候,如果因为意外的情况,比如服务宕机,网络超时,服务返回error等原因,客户端并没有得到正确的返回结果,那么客户端会有一些处理,这个处理方式就是FailMode。 Failover 这个模式下Client会关闭这个连接,尝试下一个服务节点(根据路由选择下一个,如果是随机算法,有可能会选择相同的节点)。 当然它有一个重试次数的限制
我遇到了Spring Cloud Config Server和Eureka Server Profiling的问题。 假设我有3个服务的名称(“Spring.application.name”)为: 我想在2个区域(dev和prod)中部署每个服务。在Dev区域中,每个服务将运行在localhost上,而在prod中,它将有一些不同的URL。dev区域的'myapp-spring-cloud-co
创建客户端有两种方式,一种是直接使用特化的构造器函数,另一种是使用工厂构造器函数。 第一种方式返回的是具体的客户端结构体指针对象,第二种方式返回的是客户端接口对象。 使用特化的构造器函数创建客户端 特化的构造器函数有下面几个: func NewHTTPClient(uri ...string) (client *HTTPClient) func NewTCPClient(uri ...string
WebSocketClient 结构体指针上只有如下两个可设置的字段: Header 字段 用来设置自定义的 HTTP 头信息。 MaxConcurrentRequests 方法 该方法返回最大并发请求数。 SetMaxConcurrentRequests 方法 该方法用于设置最大并发请求数,当并发请求超过该设置之后,后面的请求将会排队等待。该设置默认值为 10。
TCPClient 除了包含上面的继承自 SocketClient 的设置以外,还有以下几个可以设置的字段: Linger 字段 用于设置当连接中仍有数据等待发送或接受时的 Close 方法的行为。 如果其值小于 0(默认),Close 方法立即返回,操作系统停止后台数据发送;如果其值等于 0,Close 立刻返回,操作系统丢弃任何未发送或未接收的数据;如果其值大于 0,Close 方法阻塞最多
TCPClient 和 UnixClient 这两个结构体包含 SocketClient 这个匿名字段,因此,SocketClient 上的字段和方法都会被继承。 ReadBuffer 字段 设置与连接相关的操作系统接收缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。 WriteBuffer 字段 设置与连接相关的操作系统发送缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。