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

Jira ScriptRunner脚本适配报错:internalDelegator非ChangeGroup字段

处理Jira ScriptRunner监听脚本中的ChangeItem查询错误

问题场景

我正在Jira中编写ScriptRunner监听脚本,用于在Impediment类型的问题更新时触发执行,原代码如下:

import com.atlassian.event.Event
import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;
import org.ofbiz.core.entity.GenericValue;
import org.ofbiz.core.entity.GenericEntity;

import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.event.issue.AbstractIssueEventListener;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.issue.ModifiedValue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
import com.atlassian.jira.issue.util.IssueChangeHolder;
import org.apache.log4j.Logger
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.component.ComponentAccessor
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.Logger;
import org.ofbiz.core.entity.GenericValue;

def log = Logger.getLogger("atlassian-jira.log")
log.warn("Start Auto Defaults Listener");
log.warn("IssueMounaEvent = " + event); 
Issue issue = event.getIssue();
log.warn("IssueMouna = " + issue);

if (issue.getIssueType().getName().equalsIgnoreCase("Impediment")) 
{
log.warn("Analyzing IMPEDIMENT changelog Mouna ...");
event2= (IssueEvent) event; 
def warning = analyzeImpedimentChangeLog(event2);

}

def analyzeImpedimentChangeLog(IssueEvent event) {
def warning = "";
log.warn("IMPEDIMENT STATUS ")
List<GenericValue> changeItems = null;
def impedimentStatus = event.getIssue().getStatus().getName();
log.warn("IMPEDIMENT STATUS "+impedimentStatus)
if (!"New".equalsIgnoreCase(impedimentStatus) && !"Inspecting".equalsIgnoreCase(impedimentStatus)) {

GenericValue changeLog = event.getChangeLog();
log.warn("HERE 1")

HashMap<String, Object> fields = new HashMap<String,Object>();
log.warn("HERE 2")

fields.put("group", changeLog.get("id"));
log.warn("HERE 3")

String author = changeLog.getString("author");
log.warn("HERE 4")
try{

log.warn("CHANGE LOG: "+changeLog.internalDelegator)

changeItems = changeLog.internalDelegator.findByAnd("ChangeItem", fields); 
log.warn("HERE 5")
}catch(Exception e){
log.warn("EXCEPTIONMOUNA "+e)
}

}

return warning;
}

执行时抛出错误:

2022-08-11 EXCEPTIONMOUNA java.lang.IllegalArgumentException: [GenericEntity.get] "internalDelegator" is not a field of ChangeGroup

该逻辑此前以Java插件形式实现时运行正常,现需将changeItems = changeLog.internalDelegator.findByAnd("ChangeItem", fields);适配为Groovy写法。

解决方案

问题根源

Java插件中能直接访问internalDelegator是因为插件代码拥有包级访问权限,但在Groovy脚本环境中,无法直接访问GenericValue的私有/包级内部字段,必须通过Jira官方提供的组件获取GenericDelegator实例。

修改后的代码

替换原代码中获取ChangeItem的逻辑,通过ComponentAccessor获取GenericDelegator,再执行查询:

def analyzeImpedimentChangeLog(IssueEvent event) {
    def warning = "";
    log.warn("IMPEDIMENT STATUS ")
    List<GenericValue> changeItems = null;
    def impedimentStatus = event.getIssue().getStatus().getName();
    log.warn("IMPEDIMENT STATUS "+impedimentStatus)
    if (!"New".equalsIgnoreCase(impedimentStatus) && !"Inspecting".equalsIgnoreCase(impedimentStatus)) {

        GenericValue changeLog = event.getChangeLog();
        log.warn("HERE 1")

        // Groovy简化Map创建语法
        def fields = [group: changeLog.get("id")]
        log.warn("HERE 2")

        String author = changeLog.getString("author");
        log.warn("HERE 3")
        try{
            // 通过ComponentAccessor获取官方提供的GenericDelegator实例
            def delegator = ComponentAccessor.getComponent(org.ofbiz.core.entity.GenericDelegator)
            changeItems = delegator.findByAnd("ChangeItem", fields); 
            log.warn("HERE 4")
            log.warn("获取到的ChangeItem数量: " + changeItems.size())
        }catch(Exception e){
            log.warn("EXCEPTIONMOUNA "+e)
        }

    }

    return warning;
}

额外优化建议

  • 清理原代码中重复的类导入语句,比如多次导入Logger、ComponentAccessor等,避免冗余
  • 使用Groovy原生的Map语法替代Java的HashMap创建方式,代码更简洁

内容的提问来源于stack exchange,提问作者منى

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:03:05