Using issue.setComponentObjects([component.getGenericValue()]) to set Component in a subtask created in a post function. This does not work.

SivaRanjani November 11, 2016

HI,

Iam trying to create a Subtask in a post function. WIth that writing a code to overwrite the Component value in Subtask . The code is

ProjectComponent component = projectComponentManager.findByComponentName(project.getId,"Confluence")

 issue.setComponentObjects([component.getGenericValue()])    

I do not see error in the log as well. But the old component is seen in the subtask and not the new one.

Iam using JIRA 6.4.14 and Script Runner 3.0.16.

1 answer

0 votes
crf
Atlassian Team
Atlassian Team members are employees working across the company in a wide variety of roles.
November 11, 2016

GenericValue is a key-value representation of the database table row.  This is not a great way to represent data, so over the past several years we have been phasing them out of the API in favor of concrete, strongly-typed objects like ProjectComponent.  In places where we had to add a new method, the usual convention we have followed is to lead the old method alone (until recently; I think most of these finally changed in JIRA 7), and add a new one that speaks of "objects" instead.  For example, ProjectManager has these:

 

/**
     * Retrieve a single project by it's id.
     *
     * @param id the Project ID.
     * @return GenericValue representation of a Project.
     * @throws DataAccessException If any errors occur accessing the DB.
     * @deprecated please use {@link #getProjectObj}
     */
    @Deprecated
    GenericValue getProject(Long id) throws DataAccessException;

    /**
     * Retrieves a single {@link Project} by its id.
     *
     * @param id ID of the Project.
     * @return Project object or null if project with that id doesn't exist.
     * @throws DataAccessException If any errors occur accessing the DB.
     */
    Project getProjectObj(Long id) throws DataAccessException;

 

The former will give you a GenericValue while the latter will give you a Project.  The story is similar for project components and setting them for an issue.  MutableIssue has these:

 

/**
     * Sets the components for this Issue.
     * @param components the new components value
     *
     * @deprecated Use {@link #setComponentObjects(java.util.Collection)} instead. Since v5.0.
     */
    void setComponents(Collection<GenericValue> components);
    /**
     * Sets the components for this Issue.
     * @param components the new components value
     *
     * @since v5.0
     */
    void setComponentObjects(Collection<ProjectComponent> components);

 

So if you use the old setComponents then you have to give it GenericValue objects in the collection, but if you use setComponentObjects then you should just use ProjectComponent directly.

In short, just get rid of the getGenericValue() call.  You don't need it, as you just want to stick with the ProjectComponent that you already have.

 

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events