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

调用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,提问作者منى

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:23:16