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的键如果是变量可以直接用括号包裹
额外排查建议
- 确认AD Manager字段的名称完全匹配(注意大小写、空格),可以在Jira后台的自定义字段页面核对
- 确认AD Manager是单用户选择字段,如果是多用户字段,需要调整代码处理List类型的值
- 检查监听器的触发时机:如果是
Issue Created事件,确保AD Manager字段在创建时已经被填充(比如通过必填设置或自动化预填充)
内容的提问来源于stack exchange,提问作者user3699338
相关产品推荐
相关产品推荐

