Jira创建关联Issue时新ID为空引发空指针异常的解决咨询
问题描述
我想要为一个超级功能Issue创建Feature类型的关联Issue,编写了如下代码:
void createFeature(Issue issue, List<String> componentList){ // Issue issue //def issueManager = ComponentAccessor.issueManager //def issueFactory = ComponentAccessor.issueFactory def issueLinkManager = ComponentAccessor.issueLinkManager //def userManager = ComponentAccessor.userManager def authenticationContext = ComponentAccessor.jiraAuthenticationContext def issueFactory = ComponentAccessor.getIssueFactory() def issueManager = ComponentAccessor.getIssueManager() def userManager = ComponentAccessor.getUserUtil() def currentUserObj = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); MutableIssue newIssue= ComponentAccessor.issueFactory.issue newIssue.setProjectObject(issue.getProjectObject()) newIssue.setSummary("MOUNA CAMELIA") newIssue.setIssueTypeId("19") int issueLinkType= 10070 long sequence =1 long newissueTypeID= 19 long myissueID= issue.getId() MutableIssue newissue newissue = issueFactory.getIssue() //set values newissue.setProjectObject(issue.projectObject) newissue.setIssueTypeId("19") newissue.setSummary("MOUNA CAMELIA") newissue.setDescription("MOUNA CAMELIA") newissue.reporter = issue.getReporter() def newIssueCreated = issueManager.createIssueObject(currentUserObj, newissue) newIssue.setDescription(issue.getDescription()) for(String component: componentList){ log.warn("MOUNA CAMELIA component"+ component +" NEW ISSUE "+ newIssue) log.warn("MOUNA CAMELIA Component ====="+ component+"===== myissueID ====="+ myissueID+" =====newissueTypeID ====="+newissueTypeID +" =====issueLinkType ====="+issueLinkType +" =====sequence ====="+ sequence +" =====authenticationContext.getLoggedInUser() ====="+authenticationContext.getLoggedInUser()+" newIssue.getId() "+newIssue.getId()) issueLinkManager.createIssueLink(myissueID, newIssue.getId(), issueLinkType, sequence, authenticationContext.getLoggedInUser()) } }
调用issueLinkManager.createIssueLink(myissueID, newIssue.getId(), issueLinkType, sequence, authenticationContext.getLoggedInUser())设置关联Issue时触发空指针异常,原因是newIssue.getId()返回null,且无法手动分配Issue ID,请问如何让Jira自动生成该ID以避免空指针异常?
问题原因与解决方法
核心问题
代码里存在变量混淆:同时创建了newIssue和newissue两个MutableIssue对象,实际被Jira持久化的是newissue,但后续关联操作却用了从未被保存的newIssue——这个对象未进入Jira数据库,自然没有自动生成的ID,导致空指针。
修正步骤
- 删除冗余对象:移除未被持久化的
newIssue变量,统一使用newissue(建议重命名为更清晰的featureIssue,避免拼写混淆)。 - 使用持久化后的对象ID:
issueManager.createIssueObject()返回的newIssueCreated是已经完成持久化的Issue对象,自带Jira自动生成的ID,关联操作必须用这个对象的ID。 - 提前设置字段:如果需要继承原Issue的描述,要在调用
createIssueObject()前设置到待创建的Issue对象上,否则持久化后再设置不会生效。
修正后的代码
void createFeature(Issue issue, List<String> componentList){ def issueLinkManager = ComponentAccessor.issueLinkManager def authenticationContext = ComponentAccessor.jiraAuthenticationContext def issueFactory = ComponentAccessor.getIssueFactory() def issueManager = ComponentAccessor.getIssueManager() def currentUserObj = authenticationContext.getLoggedInUser() // 创建待生成的Feature Issue对象 MutableIssue featureIssue = issueFactory.getIssue() featureIssue.setProjectObject(issue.getProjectObject()) featureIssue.setIssueTypeId("19") featureIssue.setSummary("MOUNA CAMELIA") // 提前设置描述,确保持久化后生效 featureIssue.setDescription(issue.getDescription()) featureIssue.setReporter(issue.getReporter()) // 持久化Issue,获取带自动生成ID的对象 Issue createdFeatureIssue = issueManager.createIssueObject(currentUserObj, featureIssue) if (!createdFeatureIssue) { log.error("Feature Issue创建失败") return } long originalIssueId = issue.getId() int issueLinkType = 10070 long sequence = 1 for(String component : componentList){ log.warn("关联组件:{},原Issue ID:{},新Feature Issue ID:{}", component, originalIssueId, createdFeatureIssue.getId()) // 使用持久化后的ID创建关联 issueLinkManager.createIssueLink( originalIssueId, createdFeatureIssue.getId(), issueLinkType, sequence, currentUserObj ) } }
关键说明
- Jira的Issue ID只有在对象被持久化到数据库后才会自动生成,必须通过
issueManager.createIssueObject()或issueManager.createIssue()完成持久化,返回的对象才会有有效ID。 - 避免创建多个未使用的
MutableIssue对象,防止变量混淆引发错误。 - 调用
createIssueObject()后建议添加非空判断,避免因创建失败导致后续操作异常。
内容的提问来源于stack exchange,提问作者منى
相关产品推荐
相关产品推荐

