调用issueLinkManager.createIssueLink时出现空指针异常求助
调用JIRA issueLinkManager.createIssueLink时出现空指针异常(所有参数非null)
问题描述
调用JIRA的issueLinkManager.createIssueLink接口时触发空指针异常,但已打印所有传入参数确认均不为null:
MOUNA CAMELIA ===== myissueID =====1521112 =====newissueTypeID =====1782817 =====issueLinkType =====10070 =====sequence =====1 =====authenticationContext.getLoggedInUser() =====mouh(JIRAUSER65000)issuelinkmanager====com.atlassian.jira.issue.link.DefaultIssueLinkManager@49e3bd37
相关代码:
void createFeature(Issue issue, List<String> componentList){ def issueLinkManager = ComponentAccessor.issueLinkManager def authenticationContext = ComponentAccessor.jiraAuthenticationContext def issueFactory = ComponentAccessor.getIssueFactory() def issueManager = ComponentAccessor.getIssueManager() def userManager = ComponentAccessor.getUserUtil() def currentUserObj = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); long issueLinkType= 10070 long sequence =1 long newissueTypeID= 19 long myissueID= issue.getId() MutableIssue newissue= ComponentAccessor.issueFactory.issue //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) long newIssueCreatedID= newIssueCreated.getId() for(String component: componentList){ log.warn("MOUNA CAMELIA ===== myissueID ====="+ myissueID+" =====newissueTypeID ====="+newIssueCreated.getId() +" =====issueLinkType ====="+issueLinkType +" =====sequence ====="+ sequence +" =====authenticationContext.getLoggedInUser() ====="+authenticationContext.getLoggedInUser() +"issuelinkmanager===="+issueLinkManager) issueLinkManager.createIssueLink(myissueID, newIssueCreatedID, issueLinkType, sequence, authenticationContext.getLoggedInUser()) } }
可能原因及解决方案
1. IssueLinkType ID无效
你传入的issueLinkType=10070可能对应一个已被删除或不存在的链接类型。createIssueLink内部会根据ID查找IssueLinkType对象,若找不到会触发NPE。
- 排查方式:在JIRA后台查看所有Issue链接类型,确认ID=10070的类型是否存在且启用。
2. 新创建的Issue未持久化到数据库
你使用issueManager.createIssueObject创建Issue,这个方法仅生成内存中的Issue对象,并未真正提交到数据库。即使拿到了ID,JIRA内部在创建链接时可能无法找到对应的持久化记录,导致NPE。
- 解决方案:改用
IssueService创建Issue,确保事务提交和持久化完成,示例代码如下:
void createFeature(Issue issue, List<String> componentList){ def issueLinkManager = ComponentAccessor.issueLinkManager def authenticationContext = ComponentAccessor.jiraAuthenticationContext def issueService = ComponentAccessor.getIssueService() def currentUserObj = authenticationContext.getLoggedInUser() long issueLinkType = 10070 long sequence = 1 long myissueID = issue.getId() // 构建Issue输入参数 IssueInputParameters issueInput = issueService.newIssueInputParameters() issueInput.setProjectId(issue.getProjectId()) issueInput.setIssueTypeId("19") issueInput.setSummary("MOUNA CAMELIA") issueInput.setDescription("MOUNA CAMELIA") issueInput.setReporterId(issue.getReporterId()) // 验证参数并创建Issue IssueService.CreateValidationResult validationResult = issueService.validateCreate(currentUserObj, issueInput) if (validationResult.isValid()) { IssueService.IssueResult createResult = issueService.create(currentUserObj, validationResult) if (createResult.isValid()) { MutableIssue newIssueCreated = createResult.getIssue() long newIssueCreatedID = newIssueCreated.getId() for(String component : componentList){ log.warn("MOUNA CAMELIA ===== myissueID =====${myissueID} =====newIssueID =====${newIssueCreatedID} =====issueLinkType =====${issueLinkType} =====sequence =====${sequence} =====user =====${currentUserObj} ====issuelinkmanager====${issueLinkManager}") issueLinkManager.createIssueLink(myissueID, newIssueCreatedID, issueLinkType, sequence, currentUserObj) } } else { log.error("创建Issue失败: ${createResult.getErrorCollection()}") } } else { log.error("验证Issue参数失败: ${validationResult.getErrorCollection()}") } }
3. 线程上下文导致用户对象异常
虽然打印时用户对象存在,但在执行createIssueLink时,线程上下文可能发生变化,导致用户对象内部状态异常。
- 解决方案:提前获取并复用
currentUserObj,不要在循环中重复调用authenticationContext.getLoggedInUser()。
4. 查看完整堆栈日志
空指针的具体堆栈信息能精准定位问题,比如如果堆栈显示在DefaultIssueLinkManager.getIssueLinkTypeObject方法中抛出NPE,那就是IssueLinkType不存在;如果是在获取Issue对象时抛出,那就是新创建的Issue未持久化。
内容的提问来源于stack exchange,提问作者منى
相关产品推荐
相关产品推荐

