使用JiraRestClient(Java)创建Jira Issue时遇400错误求助
使用Jira REST Java Client创建Issue时出现400错误
依赖配置
compile 'com.atlassian.jira:jira-rest-java-client-api:5.2.4' compile 'com.atlassian.jira:jira-rest-java-client-core:5.2.4'
原创建Issue代码
@SneakyThrows public BasicIssue createIssue(JiraIssueType jiraIssueType) { return jiraRestClient.getIssueClient().createIssue( IssueInput.createWithFields( new FieldInput(IssueFieldId.PROJECT_FIELD, PROJECT_KEY), new FieldInput(IssueFieldId.ISSUE_TYPE_FIELD, jiraIssueType.getValue()), new FieldInput(IssueFieldId.SUMMARY_FIELD, String.format("Add new dataset %s to object type %s", "toy", "story")), new FieldInput(IssueFieldId.DESCRIPTION_FIELD, "descrption") )).fail(throwable -> log.error(throwable.getMessage())) .claim(); }
错误堆栈
Caused by: RestClientException{statusCode=Optional.of(400), errorCollections=[ErrorCollection{status=400, errors={issuetype=Can not instantiate value of type [simple type, class com.atlassian.jira.rest.api.issue.ResourceRef] from JSON integral number; no single-int-arg constructor/factory method, project=project is required}, errorMessages=[]}]} at com.atlassian.jira.rest.client.internal.async.AbstractAsynchronousRestClient$2.apply(AbstractAsynchronousRestClient.java:176) at com.atlassian.jira.rest.client.internal.async.AbstractAsynchronousRestClient$2.apply(AbstractAsynchronousRestClient.java:170) Caused by: RestClientException{statusCode=Optional.of(400), errorCollections=[ErrorCollection{status=400, errors={issuetype=Can not instantiate value of type [simple type, class com.atlassian.jira.rest.api.issue.ResourceRef] from JSON integral number; no single-int-arg constructor/factory method, project=project is required}, errorMessages=[]}]}
问题分析与解决方案
错误提示包含两个核心问题:
- project字段验证失败:直接传递字符串无法被Jira正确解析为
ResourceRef类型,Jira期望接收包含key或id的对象结构。 - issuetype序列化失败:传入的数值类型无法直接实例化为
ResourceRef,需要封装为ResourceRef对象。
修正后的代码如下:
@SneakyThrows public BasicIssue createIssue(JiraIssueType jiraIssueType) { // 用ResourceRef封装project(使用project key) ResourceRef projectRef = new ResourceRef(null, PROJECT_KEY); // 用ResourceRef封装issuetype(假设jiraIssueType.getValue()是issue type的ID) ResourceRef issueTypeRef = new ResourceRef(jiraIssueType.getValue().toString(), null); return jiraRestClient.getIssueClient().createIssue( IssueInput.createWithFields( new FieldInput(IssueFieldId.PROJECT_FIELD, projectRef), new FieldInput(IssueFieldId.ISSUE_TYPE_FIELD, issueTypeRef), new FieldInput(IssueFieldId.SUMMARY_FIELD, String.format("Add new dataset %s to object type %s", "toy", "story")), new FieldInput(IssueFieldId.DESCRIPTION_FIELD, "description") )).fail(throwable -> log.error(throwable.getMessage())) .claim(); }
关键修改点
- Project字段:
ResourceRef第一个参数传ID(无需则填null),第二个参数传project key。 - IssueType字段:如果
jiraIssueType.getValue()是issue type的ID,第一个参数传ID的字符串形式,第二个参数传null;如果是issue type的名称,交换两个参数位置即可。
内容的提问来源于stack exchange,提问作者Paul Plato
相关产品推荐
相关产品推荐

