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,提问作者منى
相关产品推荐
相关产品推荐

