我已经广泛浏览了这个错误,人们要么说字段名称错误,要么字段值错误,但我尝试了所有可能的组合都无济于事。
我正在使用 JIRA 的 Java API 创建一个新错误,我的公司有一个名为“按测试类型检测”的字段 (customfield_15870)。可接受的值为“集成测试”、“功能测试”和“性能测试”。每个看起来都像这样(我从现有的错误中对此字段进行了 getField 并获得了单独的值)
值:“性能测试” 编号:“12345” 自我:“https:///rest/api/2/customFieldOption/12345” 禁用:假
这告诉我字段名称正确,各个值也正确。
这是我的代码:
Map<String, Object> cascadingValues = new HashMap<String, Object>();
cascadingvalues.put("value", "Performance Testing");
cascadingvalues.put("id", "12345");
cascadingvalues.put("disabled", false);
cascadingvalues.put("self", "https://<url>/rest/api/2/customFieldOption/12345");
iib.setFieldValue("customfield_15870", new ComplexIssueInputFieldValue(cascadingValues));
我也尝试过这些选项:
iib.setFieldValue("customfield_15870", ComplexIssueInputFieldValue.with("value", "Performance Testing"));
iib.setFieldValue("customfield_15870", ComplexIssueInputFieldValue.with("id", "Performance Testing"));
iib.setFieldValue("customfield_15870", ComplexIssueInputFieldValue.with("value", "12345"));
iib.setFieldValue("customfield_15870", ComplexIssueInputFieldValue.with("id", "12345"));
然而,它向我抛出“选项 id 'null' 无效”错误。有人可以帮忙吗?
这是堆栈跟踪:
RestClientException{statusCode=Optional.of(400), errorCollections=[ErrorCollection{status=400, errors={customfield_15870=Option id 'null' is not valid}, errorMessages=[]}]}
at com.atlassian.jira.rest.client.internal.async.DelegatingPromise.claim(DelegatingPromise.java:47)
at com.bla.jira.IssueWriterBeta.createIssue(IssueWriterBeta.java:340)
at com.bla.almutil.ConnectToJira.createEpic(ConnectToJira.java:282)
at com.bla.almutil.ConnectToJira.main(ConnectToJira.java:378)
Caused by: RestClientException{statusCode=Optional.of(400), errorCollections=[ErrorCollection{status=400, errors={customfield_15870=Option id 'null' is not valid}, errorMessages=[]}]}
at com.atlassian.jira.rest.client.internal.async.AbstractAsynchronousRestClient$2.apply(AbstractAsynchronousRestClient.java:173)
at com.atlassian.jira.rest.client.internal.async.AbstractAsynchronousRestClient$2.apply(AbstractAsynchronousRestClient.java:167)
at com.atlassian.httpclient.api.ResponsePromiseMapFunction.apply(ResponsePromiseMapFunction.java:48)
at com.atlassian.httpclient.api.ResponsePromiseMapFunction.apply(ResponsePromiseMapFunction.java:12)
at com.atlassian.util.concurrent.Promises$Of$3.apply(Promises.java:295)
at com.atlassian.util.concurrent.Promises$2.onSuccess(Promises.java:185)
at com.google.common.util.concurrent.Futures$7.run(Futures.java:1072)
at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:161)
at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:146)
at com.google.common.util.concurrent.AbstractFuture.done(AbstractFuture.java:235)
at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:172)
at com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:53)
at com.atlassian.util.concurrent.Promises$Of$3.apply(Promises.java:295)
at com.atlassian.util.concurrent.Promises$2.onSuccess(Promises.java:185)
at com.google.common.util.concurrent.Futures$7.run(Futures.java:1072)
at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:161)
at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:146)
at com.google.common.util.concurrent.AbstractFuture.done(AbstractFuture.java:235)
at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:172)
at com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:53)
at com.atlassian.httpclient.apache.httpcomponents.SettableFuturePromiseHttpPromiseAsyncClient$1$1.run(SettableFuturePromiseHttpPromiseAsyncClient.java:46)
at com.atlassian.httpclient.apache.httpcomponents.SettableFuturePromiseHttpPromiseAsyncClient$ThreadLocalDelegateRunnable$1.run(SettableFuturePromiseHttpPromiseAsyncClient.java:197)
at com.atlassian.httpclient.apache.httpcomponents.SettableFuturePromiseHttpPromiseAsyncClient.runInContext(SettableFuturePromiseHttpPromiseAsyncClient.java:90)
at com.atlassian.httpclient.apache.httpcomponents.SettableFuturePromiseHttpPromiseAsyncClient$ThreadLocalDelegateRunnable.run(SettableFuturePromiseHttpPromiseAsyncClient.java:192)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
提前谢谢您!
解决了这个问题,我无意中在不同的地方使用了相同的自定义字段 id 覆盖了这些值。然而,由于在其他地方找不到 Java API 解决方案,我无论如何都会发布此错误的代码:
Map<String, Object> cascadingValues = new HashMap<String, Object>();
cascadingvalues.put("value", "Performance Testing");
cascadingvalues.put("id", "12345");
iib.setFieldValue("customfield_15870", new ComplexIssueInputFieldValue(cascadingValues));
仅像其他选择字段一样设置值并不能满足这种自定义字段的需要。