如何修复错误“无法在空对象上获取属性‘Id’”

问题描述 投票:0回答:1

在 Jira 的 ScriptRunner Listener 中,我收到此错误....

2023-11-27 08:52:23.844 信息 - 将对象序列化为“接口 java.util.List” 2023-11-27 08:52:23.915 INFO - GET /rest/api/2/field asObject 请求持续时间:955ms 2023-11-27 08:52:24.116 错误 - 无法在第 25 行的空对象上获取属性“accountId” 2023-11-27 08:52:24.120 错误 - 类:com.adaptavist.sr.cloud.events.WebhookExecution,配置:null

我的脚本看起来像这样......

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

//to check the listener is only applied to the correct project and issue type
def projectKey = "SIG" 
if (issue == null || ((Map) issue.fields.project).key != projectKey || issue.fields.issuetype.name != 'Service Request with Approvals') {
    logger.info("Wrong Project ${issue.fields.project.key} or not a SR with Approvals")
    return
}

def ADManagerCfId = customFields.find { it.name == 'AD Manager' }?.id
def ApproversCfId = customFields.find { it.name == 'Approvers' }?.id

//get the values from your issues
def ADManager = issue.fields[ADManagerCfId] as Map
def ApproversName = issue.fields[ApproversCfId] as Map

//update the issue with the new approver
put("/rest/api/2/issue/${issue.key}")
   .header("Content-Type", "application/json")
   .body([
           fields: [
                   "${ApproversCfId}": [ //You need here to interpolate ApproversCfId as a String
                       ['accountId': ADManager.accountId]
                       ]
           ]
   ])
   .asString()
   logger.info ("Updated Approver with ${ADManager.accountId}")

期望是... 在 Jira 中创建问题记录后,脚本应该将 AD Manager 字段的值复制到
批准者字段。

我做错了什么?我该如何修复该错误?

问候,

jira scriptrunner-for-jira
1个回答
0
投票

重要的错误行是:

Cannot get property 'accountId' on null object on line 25

意思是在你的代码第25行,看起来就是那个:

                       ['accountId': ADManager.accountId]

错误消息指出它无法从变量中访问/获取名为

accountId
的属性,因为它是
null
(该变量中没有存储任何值)。

因此,我们需要检查

ADManager
变量在哪里以及为什么会变成
null

该变量是在该行中引入的:

def ADManager = issue.fields[ADManagerCfId] as Map

假设

ADManagerCfId
具有正确的值,我看到的只是该字段在该问题上根本没有设置的情况。结果是从
null
获取
issue.fields[ADManagerCfId]
值并将其存储在
ADManager
变量中。

让我们检查依赖的

ADManagerCfId
变量以及它是否可以获得错误的值。该变量是在该行中引入的:

def ADManagerCfId = customFields.find { it.name == 'AD Manager' }?.id

对于这个,我看到的只是一种场景,它找不到具有指定名称的自定义字段

AD Manager
。您可能需要仔细检查该字段的名称是否正确。此外,我建议不要使用字段名称,而是直接使用字段 ID。当有人重命名字段时,会更改字段名称,但不会更改字段 ID。因此,对于脚本来说,使用字段 id 更安全。

通过直接使用字段 id,您最终还可以节省自己的请求调用并节省运行时间。因此,双重建议使用字段 ID 而不是字段名称。 ;)

根据所提供的信息,我能看到和说出的就是这些。 :)

© www.soinside.com 2019 - 2024. All rights reserved.