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

Jira ScriptRunner监听器报错'Cannot get property accountId on null object'如何解决?

问题定位与修复方案

错误Cannot get property 'accountId' on null object on line 25的核心原因是**ADManager变量为null**,导致无法调用accountId属性。以下是具体排查点和修复代码:

可能的出错原因

  • ADManagerCfId未正确获取到AD Manager字段的ID(比如字段名称拼写错误、字段不存在),导致issue.fields[ADManagerCfId]返回null
  • 当前创建的工单中,AD Manager字段未填写任何值
  • AD Manager字段类型不是单用户字段,无法直接转为Map获取accountId

修复后的完整代码

def customFields = get("/rest/api/2/field")
        .asObject(List)
        .body
        .findAll { (it as Map).custom } as List<Map>

// 校验项目和工单类型
def projectKey = "SIG" 
if (issue == null) {
    logger.info("Issue object is null")
    return
}

def project = issue.fields.project as Map
if (!project || project.key != projectKey) {
    logger.info("Wrong Project: ${project?.key ?: 'unknown'}")
    return
}

def issueType = issue.fields.issuetype as Map
if (!issueType || issueType.name != 'Service Request with Approvals') {
    logger.info("Not a Service Request with Approvals: ${issueType?.name ?: 'unknown'}")
    return
}

// 查找自定义字段ID,增加空值校验
def ADManagerCfId = customFields.find { it.name == 'AD Manager' }?.id
if (!ADManagerCfId) {
    logger.error("AD Manager custom field not found")
    return
}

def ApproversCfId = customFields.find { it.name == 'Approvers' }?.id
if (!ApproversCfId) {
    logger.error("Approvers custom field not found")
    return
}

// 获取AD Manager字段值,增加空值校验
def ADManager = issue.fields[ADManagerCfId]
if (!ADManager) {
    logger.info("AD Manager field is empty, skip updating approvers")
    return
}

// 确保AD Manager是用户对象(单用户字段)
if (!(ADManager instanceof Map) || !ADManager.accountId) {
    logger.error("AD Manager field is not a valid user object")
    return
}

// 更新Approvers字段
def updateResponse = put("/rest/api/2/issue/${issue.key}")
   .header("Content-Type", "application/json")
   .body([
           fields: [
                   (ApproversCfId): [ 
                       ['accountId': ADManager.accountId]
                   ]
           ]
   ])
   .asString()

// 校验更新结果
if (updateResponse.status >= 200 && updateResponse.status < 300) {
    logger.info("Successfully updated Approvers with accountId: ${ADManager.accountId}")
} else {
    logger.error("Failed to update issue: ${updateResponse.status} - ${updateResponse.body}")
}

关键修复点

  • 增加层层空值校验:从字段ID查找、字段值获取到用户对象有效性,每一步都做非空判断,避免NullPointerException
  • 优化项目/工单类型校验:拆分原有的复杂判断,避免issue.fields.project或issue.fields.issuetype为null时出错
  • 校验更新请求结果:添加响应状态判断,方便排查更新失败的情况
  • 修正字段ID插值:原代码中"${ApproversCfId}"可以简化为(ApproversCfId),Groovy中Map的键如果是变量可以直接用括号包裹

额外排查建议

  1. 确认AD Manager字段的名称完全匹配(注意大小写、空格),可以在Jira后台的自定义字段页面核对
  2. 确认AD Manager是单用户选择字段,如果是多用户字段,需要调整代码处理List类型的值
  3. 检查监听器的触发时机:如果是Issue Created事件,确保AD Manager字段在创建时已经被填充(比如通过必填设置或自动化预填充)

内容的提问来源于stack exchange,提问作者user3699338

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:17:03