Error Using setCustomFieldValue

Paul Tiseo
Contributor
November 2, 2018

In the ScriptRunner console, I am writing a script to make the Epic Name equal to the Summary for a set of issues. This is my code:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.jql.builder.JqlQueryBuilder
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.web.bean.PagerFilter

def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def searchService = ComponentAccessor.getComponentOfType(SearchService.class)

def customField = customFieldManager.getCustomFieldObject((long) 10002)
JqlQueryBuilder jqlBuilder = JqlQueryBuilder.newBuilder()
jqlBuilder.where().project("ITSD").and().issueType("Epic")

SearchResults results = searchService.searchOverrideSecurity(
    ComponentAccessor.getUserManager().getUserByName("sysadmin"),
    jqlBuilder.buildQuery(),
    PagerFilter.getUnlimitedFilter()
)

def issues = results.getIssues();
for (def issue: issues) {
    //log.error 'issue: ' + issue.getCustomFieldValue(customField)
    issue.setCustomFieldValue(customField, issue.getSummary())
    //log.error 'issue: ' + issue.getCustomFieldValue(customField)
}

I get an error when calling setCustomFieldValue() at the end that says that customField is an ImmutableCustomField. How do I fix this code to make it work?

Error is:

groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.DocumentIssueImpl.setCustomFieldValue() is applicable for argument types: (com.atlassian.jira.issue.fields.ImmutableCustomField, java.lang.String) values: [Epic Name, Application Portfolio Manangement - Phase I] Possible solutions: getCustomFieldValue(com.atlassian.jira.issue.fields.CustomField) at Script47.run(Script47.groovy:24)

 

1 answer

1 vote
Ivan Tovbin
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
November 2, 2018

Hi Paul,

Here's how you do it:

import com.atlassian.jira.issue.MutableIssue

def issues = results.getIssues().collect{ComponentAccessor.getIssueManager().getIssueByCurrentKey(it.getKey())}
for (def issue : issues){
issue = issue as MutableIssue
issue.setCustomFieldValue(.........)
}
Paul Tiseo
Contributor
November 5, 2018

That works. Of course, the question is why do I have to re-get an issue? I guess the SearchService does not return a mutable issue?

Also, now I eveolved the script, slightly different than yours, and I get a subsequent error:

import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.jql.builder.JqlQueryBuilder
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.web.bean.PagerFilter

IssueManager issueManager = ComponentAccessor.getIssueManager()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
SearchService searchService = ComponentAccessor.getComponentOfType(SearchService.class)
//ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
ApplicationUser user = ComponentAccessor.getUserManager().getUserByName("sysadmin")

CustomField customField = customFieldManager.getCustomFieldObjectByName("Epic Name")

JqlQueryBuilder jqlBuilder = JqlQueryBuilder.newBuilder()
jqlBuilder.where().project("ITSD").and().issueType("Epic")

SearchResults results = searchService.searchOverrideSecurity(user, jqlBuilder.buildQuery(), PagerFilter.getUnlimitedFilter())

def issues = results.getIssues()

for (def issue: issues) {
log.error 'issue: ' + issue.getKey()
MutableIssue mutableIssue = (issueManager.getIssueByCurrentKey(issue.getKey()))
mutableIssue.setCustomFieldValue(customField, mutableIssue.getSummary())
issueManager.updateIssue(user, issue, EventDispatchOption.ISSUE_UPDATED, false)
}

The error seems to be about casting:

No signature of method: com.atlassian.jira.issue.managers.RequestCachingIssueManager.updateIssue() is applicable for argument types: (com.atlassian.jira.user.DelegatingApplicationUser, com.atlassian.jira.issue.DocumentIssueImpl, com.atlassian.jira.event.type.EventDispatchOption$EventDispatchOptionImpl, java.lang.Boolean) values: [sysadmin(sysadmin), DocumentIssueImpl[issueKey=ITSD-2034], com.atlassian.jira.event.type.EventDispatchOption$EventDispatchOptionImpl@7c2601c5, ...] Possible solutions: updateIssue(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.MutableIssue, com.atlassian.jira.event.type.EventDispatchOption, boolean), updateIssue(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.MutableIssue, com.atlassian.jira.issue.UpdateIssueRequest)

Any suggestions?

Ivan Tovbin
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
November 5, 2018

The reason why you have to re-get your issue as MutableIssue is because SearchService returns a DocumentIssueImpl object, which does not have any setter methods.

As for the error above you need to pass 'mutableIssue' variable into updateIssue() method instead of 'issue'

Suggest an answer

Log in or Sign up to answer