createIssueObject failed unable to create issue in transition

Shradha Singh April 20, 2020

Hello 

I am facing an issue where there is a self transition and a groovy as a post function. But createIssueObject is failing.

Can you please help.

And Error:

com.atlassian.jira.exception.CreateException
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:600)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:501)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssueObject(DefaultIssueManager.java:611)
at com.atlassian.jira.issue.managers.RequestCachingIssueManager.createIssueObject(RequestCachingIssueManager.java:201)
at com.atlassian.jira.issue.IssueManager$createIssueObject$2.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at Script90.run(Script90.groovy:119)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:159)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
at javax.script.ScriptEngine$eval.call(Unknown Source)

Caused by: com.atlassian.jira.workflow.WorkflowException
at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:780)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:592)
... 325 more
Caused by: java.lang.NullPointerException
at com.atlassian.jira.workflow.DefaultWorkflowSchemeManager.getSchemeForProject(DefaultWorkflowSchemeManager.java:359)
at com.atlassian.jira.workflow.DefaultWorkflowSchemeManager.getWorkflowName(DefaultWorkflowSchemeManager.java:330)
at com.atlassian.jira.workflow.OSWorkflowManager.getWorkflowName(OSWorkflowManager.java:154)

 

4 answers

1 vote
Nir Haimov
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 21, 2020

Hi @Shradha Singh ,

First of all, stop write additional "answer" in the post, and write "reply" to the relevant post instead.

Second, please explain in words, what are you trying to do exactly step by step?
I see a lot of code and big part of it looks not relevant at all...

Shradha Singh April 21, 2020

Hi @Nir Haimov 

In one of our JIRA project, we have  a  workflow and on one of its transition I have written a custom script post function. Requirement is that on click of "New Epic" in issue view an epic will be created and will be linked to the parent issue.

pf.png

 

 

 

This is the groovy code. It is working in our JIRA PROD which is 7.10.2. Recently we are working on upgrade and on JIRA DEV which is having 8.8.0 this code is not working.

createIssueObject() method is throwing exception.

So in order to troubleshoot it, I made the changes and tried to create just a Task instead of Epic but it is also failing.

 

Groovy:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.project.Project
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.issue.customfields.CustomFieldType
import com.atlassian.jira.issue.customfields.*
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.index.IndexException
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.fugue.Option
import org.apache.log4j.Category
import com.atlassian.jira.issue.issuetype.IssueType
import com.atlassian.jira.issue.link.IssueLinkType
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.link.IssueLinkTypeManager
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.plugin.PluginAccessor

import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.util.IssueChangeHolder
import com.opensymphony.workflow.InvalidInputException
import com.atlassian.jira.issue.label.Label
import com.atlassian.jira.issue.label.LabelManager
import com.atlassian.jira.workflow.WorkflowTransitionUtil
import com.atlassian.jira.util.JiraUtils
import com.atlassian.jira.exception.CreateException
import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl
import com.atlassian.jira.issue.fields.config.FieldConfig
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.customfields.option.Options
import com.atlassian.jira.issue.context.IssueContextImpl

def userPropertyManager = ComponentAccessor.getUserPropertyManager();
def userManager = ComponentAccessor.getUserManager();

def issueFactory = ComponentAccessor.getIssueFactory()
def projectMgr = ComponentAccessor.getProjectManager()
def issueMgr = ComponentAccessor.getIssueManager()

CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

def authenticationContext = ComponentAccessor.getJiraAuthenticationContext()
def issueManager = ComponentAccessor.getIssueManager()
def issueIndexService = ComponentAccessor.getComponent(IssueIndexingService.class)

MutableIssue epicIss = issueFactory.getIssue()

//ApplicationUser
def loggedInUser = authenticationContext.getLoggedInUser()
println "loggedInUser "+loggedInUser

def projectManager = ComponentAccessor.getProjectManager()

//epicIss.issueTypeId = '10000'
//epicIss.setIssueTypeId("10000") //Epic Issue type Id
epicIss.setIssueTypeId("3") //Task

Project prjObj = projectManager.getProjectObjByKey('JIRAHELP')
def component="JIRA Agile"
def compVal = ComponentAccessor.getProjectComponentManager().findByComponentName(prjObj.getId(),component)

println "compVal ---"+compVal

epicIss.setComponent([compVal])

println "component setting-----"

epicIss.setSummary("TEST SUMMARY --- GROOVY")
epicIss.setDescription("TEST DESC --- GROOVY")
epicIss.setReporter(loggedInUser)

Map newIssueParams = ["issue":epicIss] as Map
try{
def issueManager = ComponentAccessor.getIssueManager()
def issueIndexService = ComponentAccessor.getComponent(IssueIndexingService.class)
Issue newIssueGv = issueManager.createIssueObject(loggedInUser, newIssueParams)
issueIndexService.reIndex(newIssueGv);

if (newIssueGv.isCreated())
{
    println "inside issue created----"

}else{
    println "inside issue creation failed ----"
}

}catch(CreateException e){
    println("++++++CreateException "+e.printStackTrace())
}

 

pf-error.png

Exception :

 

Time (on server): Tue Apr 21 2020 10:58:06 GMT+0530 (India Standard Time)

The following log information was produced by this execution. Use statements like:log.info("...") to record logging information.

2020-04-20 22:28:06,174 ERROR [workflow.AbstractScriptWorkflowFunction]: *************************************************************************************
2020-04-20 22:28:06,174 ERROR [workflow.AbstractScriptWorkflowFunction]: Script function failed on issue: JIRAHELP-3818, actionId: 181, file: null
com.atlassian.jira.exception.CreateException
	at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:600)
	at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:501)
	at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssueObject(DefaultIssueManager.java:611)
	at com.atlassian.jira.issue.managers.RequestCachingIssueManager.createIssueObject(RequestCachingIssueManager.java:201)
	at com.atlassian.jira.issue.IssueManager$createIssueObject$2.call(Unknown Source)
	at Script287.run(Script287.groovy:130)
Caused by: com.atlassian.jira.workflow.WorkflowException
	at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:780)
	at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:592)
	... 5 more
Caused by: java.lang.NullPointerException
	at com.atlassian.jira.workflow.DefaultWorkflowSchemeManager.getSchemeForProject(DefaultWorkflowSchemeManager.java:359)
	at com.atlassian.jira.workflow.DefaultWorkflowSchemeManager.getWorkflowName(DefaultWorkflowSchemeManager.java:330)
	at com.atlassian.jira.workflow.OSWorkflowManager.getWorkflowName(OSWorkflowManager.java:154)
	at com.atlassian.jira.workflow.OSWorkflowManager.getWorkflow(OSWorkflowManager.java:291)
	at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:735)
	... 6 more

 

Nir Haimov
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 22, 2020

Hi @Shradha Singh @Shradha Singh 

Sorry to tell you, but your code is a complete mess...

Tones of unnecessary imports...

Here is a working example for Jira 8 to create issue

import com.atlassian.jira.bc.issue.IssueService;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.IssueInputParameters
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.issue.link.IssueLinkManager;
import com.atlassian.jira.security.JiraAuthenticationContext;
import groovy.transform.Field;

//All components
@Field IssueService issueService = ComponentAccessor.issueService
@Field IssueLinkManager issueLinkManager = ComponentAccessor.getIssueLinkManager()
@Field IssueInputParameters issueParameters = issueService.newIssueInputParameters()
@Field JiraAuthenticationContext authCtx = ComponentAccessor.getJiraAuthenticationContext()

//projects id
@Field Long myProject = 11001

//issuetypes id
@Field String story = "10001"

@Field ApplicationUser currentUser = authCtx.getLoggedInUser()

createIssue(myProject, story, "My New issue Summary", "My New issue Description", currentUser)

def createIssue(Long project, String issuetype, String summary, String description, ApplicationUser assignee) {
try {
issueParameters.setProjectId(project)
issueParameters.setIssueTypeId(issuetype)
issueParameters.setSummary(summary)
issueParameters.setDescription(description)
issueParameters.setReporterId(currentUser.getName())
if (assignee != null) {
issueParameters.setAssigneeId(assignee.emailAddress)
}
issueParameters.addCustomFieldValue(10504, "my field new value") //long customfield id

IssueService.CreateValidationResult createValidationResult = issueService.validateCreate(currentUser, issueParameters)

if (createValidationResult.isValid()) {
IssueService.IssueResult createResult = issueService.create(currentUser, createValidationResult)

if (!createResult.isValid()) {
log.error(createResult.getErrorCollection().toString())
} else {
log.error(createResult.getIssue())

//example to create link between current issue to the new created issue
issueLinkManager.createIssueLink(issue.getId(), createResult.getIssue().getId(), 10003, 1, currentUser)
}
} else {
log.error(createValidationResult.getErrorCollection().toString())
}
} catch (e) {
log.error(e.toString())
}
}
Like # people like this
Shradha Singh April 22, 2020

Hi @Nir Haimov 

Thanks a lot!  Really appreciate your response on this. I tried and it is working in JIRA 8.8.0.

So ideally usage of createIssueObject() was incorrect. In JIRA 8.x we should use 

issueService.validateCreate() and issueService.create() methods for issue creation during transitions in workflow post functions. I had raised a case with Atlassian support also but I haven't received any solution/suggestion from them regarding these methods. 

If you suggest I will open another thread but would you suggest our current PROD JIRA version is 7.10.2 and we are testing 8.8.0 in JIRA DEV where several workflow post functions are failing because of createIssueObject().

We have approx 500 projects and several workflows. So we will have to change  createIssueObject() everywhere i.e. in each and every transition post function groovy. What is the best way to compare APIs that might change between JIRA 7.10 & JIRA 8.x

Thanks for your quick response.

Regards
Shradha

Nir Haimov
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 23, 2020

Hi @Shradha Singh 

Atlassian not supporting development in Jira, especially not in Scriptrunner which is a 3rd party plugin.

i would suggest you not to update to 8.8.0 just yet, many companies did not updated their plugins to compitable with Jira 8.8.0 (i guess because of the COVID-19)
I think 8.5.1 will be a better start, later you can upgrade to a later version of Jira, there are no API changes between Jira 8 versions.

Best way to solve you API code issues, is to see where the IDE shows you errors (in red lines) that means something change from your old code in Jira 7.X to new code in Jira 8.X

0 votes
Shradha Singh April 20, 2020

Hi   @Nir Haimov 

Can you please have a look at this issue and respond. It is somewhat similar to a post where u had suggested solution

 

https://community.atlassian.com/t5/Jira-questions/Creating-multiple-issues-based-on-selected-values-in-a/qaq-p/872218

 

Regards
Shradha

0 votes
Shradha Singh April 20, 2020

Hi 

Can anyone please help on this.

 

Regards
Shradha

0 votes
Shradha Singh April 20, 2020

Groovy:

 

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.project.Project
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.issue.customfields.CustomFieldType
import com.atlassian.jira.issue.customfields.*
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.index.IndexException
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.fugue.Option
import org.apache.log4j.Category
import com.atlassian.jira.issue.issuetype.IssueType
import com.atlassian.jira.issue.link.IssueLinkType
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.link.IssueLinkTypeManager
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.plugin.PluginAccessor
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.util.IssueChangeHolder
import com.opensymphony.workflow.InvalidInputException
import com.atlassian.jira.issue.label.Label
import com.atlassian.jira.issue.label.LabelManager
import com.atlassian.jira.workflow.WorkflowTransitionUtil
import com.atlassian.jira.util.JiraUtils
import com.atlassian.jira.exception.CreateException
import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl
import com.atlassian.jira.issue.fields.config.FieldConfig
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.customfields.option.Options
import com.atlassian.jira.issue.context.IssueContextImpl

def userPropertyManager = ComponentAccessor.getUserPropertyManager();
def userManager = ComponentAccessor.getUserManager();

def issueFactory = ComponentAccessor.getIssueFactory()
def projectMgr = ComponentAccessor.getProjectManager()
def issueMgr = ComponentAccessor.getIssueManager()

CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

def authenticationContext = ComponentAccessor.getJiraAuthenticationContext()
def issueManager = ComponentAccessor.getIssueManager()
def issueIndexService = ComponentAccessor.getComponent(IssueIndexingService.class)

MutableIssue epicIss = issueFactory.getIssue()

ApplicationUser currentUser = authenticationContext.getLoggedInUser()
def projectManager = ComponentAccessor.getProjectManager()

epicIss.issueTypeId = '10000'
Project prjObj = projectManager.getProjectObjByKey('AVSREQ')
//def component="team1"
def compVal = ComponentAccessor.getProjectComponentManager().findByComponentName(prjObj.getId(),component)

println "compVal ---"+compVal

epicIss.setComponent([compVal])

println "component setting-----"

def accountName = "TEST SYSTEMS FOR EMPLOYEE"
def customField = customFieldManager.getCustomFieldObjectByName("Customer(s)")
IssueContextImpl issueContext = new IssueContextImpl(prjObj.getId(), "10000")
FieldConfig fieldConfig = customField.getRelevantConfig(issueContext)
OptionsManager optManager = ComponentAccessor.getOptionsManager()

Options options = optManager.getOptions(fieldConfig);
Iterator iterator = options.iterator()
def customerList
while(iterator.hasNext()) {
Option option = iterator.next();
if(accountName.equalsIgnoreCase(option.getValue())) {
customerList = option
println "customer ---- option "+option
break;
}
}
epicIss.setCustomFieldValue(customFieldManager.getCustomFieldObjectByName("Customer(s)"), [customerList])
println "customer setting-----"


//MutableIssue newIssue = issueFactory.getIssue()
def projectManager = ComponentAccessor.getProjectManager()

Project prjObj = projectManager.getProjectObjByKey('AVSREQ')
ApplicationUser currentUser = authenticationContext.getLoggedInUser()


def epicName = customFieldManager.getCustomFieldObjectByName('Epic Name')
//def reqType = customFieldManager.getCustomFieldObjectByName('Request Type')
//def epicnameval = issue.getKey()+" ("+issue.getCustomFieldValue(reqType) +")"
def epicnameval = "TEST EPIC NAME BY SS"
System.out.println "--epicnameval issue" + epicnameval
epicIss.setCustomFieldValue(epicName, epicnameval)


Map newIssueParams = ["issue":epicIss] as Map<String,Object>
try{
def issueManager = ComponentAccessor.getIssueManager()
def issueIndexService = ComponentAccessor.getComponent(IssueIndexingService.class)
Issue newIssueGv = issueManager.createIssueObject(currentUser, newIssueParams)
issueIndexService.reIndex(newIssueGv);

if (newIssueGv.isCreated())
{
println "inside issue created----"

}else{
println "inside issue creation failed ----"
}

}catch(CreateException e){
System.out.println("++++++CreateException "+e.printStackTrace())
}

Suggest an answer

Log in or Sign up to answer