You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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=[]}]}

问题分析与解决方案

错误提示包含两个核心问题:

  1. project字段验证失败:直接传递字符串无法被Jira正确解析为ResourceRef类型,Jira期望接收包含key或id的对象结构。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:33:29