Missed Team ’24? Catch up on announcements here.

×
Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Problem with injecting Jira ApplicationProperties

bobizma November 16, 2016

Hi,

I'm looking for help injecting dependencies for JIRA custom userpicker field.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ru.some.jira</groupId>
    <artifactId>timetrack</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <organization>
        <name>Example Company</name>
        <url>https://example.ru/</url>
    </organization>
    <name>some Timetrack plugin for jira</name>
    <description>This is the ru.some.jira:timetrack plugin for Atlassian JIRA.</description>
    <packaging>atlassian-plugin</packaging>
    <dependencies>
        <dependency>
            <groupId>com.atlassian.jira</groupId>
            <artifactId>jira-api</artifactId>
            <version>${jira.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- Add dependency on jira-core if you want access to JIRA implementation classes as well as the sanctioned API. -->
        <!-- This is not normally recommended, but may be required eg when migrating a plugin originally developed against JIRA 4.x -->
        <dependency>
            <groupId>com.atlassian.jira</groupId>
            <artifactId>jira-core</artifactId>
            <version>${jira.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>com.atlassian.jira</groupId>
          <artifactId>jira-software-application</artifactId>
          <version>${jira.version}</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>com.atlassian.jira</groupId>
          <artifactId>jira-application-properties-plugin</artifactId>
          <version>${jira.version}</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.atlassian.plugin</groupId>
            <artifactId>atlassian-spring-scanner-annotation</artifactId>
            <version>${atlassian.spring.scanner.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.atlassian.plugin</groupId>
            <artifactId>atlassian-spring-scanner-runtime</artifactId>
            <version>${atlassian.spring.scanner.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>provided</scope>
        </dependency>
        <!-- WIRED TEST RUNNER DEPENDENCIES -->
        <dependency>
            <groupId>com.atlassian.plugins</groupId>
            <artifactId>atlassian-plugins-osgi-testrunner</artifactId>
            <version>${plugin.testrunner.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.2-atlassian-1</version>
        </dependency>
        <!-- Uncomment to use TestKit in your project. Details at https://bitbucket.org/atlassian/jira-testkit -->
        <!-- You can read more about TestKit at https://developer.atlassian.com/display/JIRADEV/Plugin+Tutorial+-+Smarter+integration+testing+with+TestKit -->
        <!--
  <dependency>
   <groupId>com.atlassian.jira.tests</groupId>
   <artifactId>jira-testkit-client</artifactId>
   <version>${testkit.version}</version>
   <scope>test</scope>
  </dependency>
  -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.8.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.atlassian.maven.plugins</groupId>
                <artifactId>maven-jira-plugin</artifactId>
                <version>${amps.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <productVersion>${jira.version}</productVersion>
                    <productDataVersion>${jira.version}</productDataVersion>
                    <!-- Uncomment to install TestKit backdoor in JIRA. -->
                    <!--
     <pluginArtifacts>
      <pluginArtifact>
       <groupId>com.atlassian.jira.tests</groupId>
       <artifactId>jira-testkit-plugin</artifactId>
       <version>${testkit.version}</version>
      </pluginArtifact>
     </pluginArtifacts>
     -->
                    <enableQuickReload>true</enableQuickReload>
                    <enableFastdev>false</enableFastdev>
                    <!-- See here for an explanation of default instructions: -->
                    <!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
                    <instructions>
                        <Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
                        <!-- Add package to export here -->
                        <Export-Package>ru.some.jira.timetrack.api,</Export-Package>
                        <!-- Add package import here -->
                        <Import-Package>org.springframework.osgi.*;resolution:="optional", org.eclipse.gemini.blueprint.*;resolution:="optional", *</Import-Package>
                        <!-- Ensure plugin is spring powered -->
                        <Spring-Context>*</Spring-Context>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.atlassian.plugin</groupId>
                <artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
                <version>${atlassian.spring.scanner.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>atlassian-spring-scanner</goal>
                        </goals>
                        <phase>process-classes</phase>
                    </execution>
                </executions>
                <configuration>
                    <scannedDependencies>
                        <dependency>
                            <groupId>com.atlassian.plugin</groupId>
                            <artifactId>atlassian-spring-scanner-external-jar</artifactId>
                        </dependency>
                    </scannedDependencies>
                    <verbose>false</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <jira.version>7.1.2</jira.version>
        <amps.version>6.2.6</amps.version>
        <plugin.testrunner.version>1.2.3</plugin.testrunner.version>
        <atlassian.spring.scanner.version>1.2.13</atlassian.spring.scanner.version>
        <!-- This key is used to keep the consistency between the key in atlassian-plugin.xml and the key to generate bundle. -->
        <atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
        <!-- TestKit version 6.x for JIRA 6.x -->
        <testkit.version>6.3.11</testkit.version>
    </properties>
</project>
<?xml version="1.0" encoding="UTF-8"?>

<atlassian-plugin key="${atlassian.plugin.key}" name="${project.name}" plugins-version="2">
  <plugin-info>
    <description>${project.description}</description>
    <version>${project.version}</version>
    <vendor name="${project.organization.name}" url="${project.organization.url}"/>
    <param name="plugin-icon">images/pluginIcon.png</param>
    <param name="plugin-logo">images/pluginLogo.png</param>
  </plugin-info>
  <!-- add our i18n resource -->
  <resource type="i18n" name="i18n" location="timetrack"/>
  <!-- add our web resources -->
  <web-resource key="timetrack-resources" name="timetrack Web Resources">
    <dependency>com.atlassian.auiplugin:ajs</dependency>
    <resource type="download" name="timetrack.css" location="/css/timetrack.css"/>
    <resource type="download" name="timetrack.js" location="/js/timetrack.js"/>
    <resource type="download" name="images/" location="/images"/>
    <context>timetrack</context>
  </web-resource>
  <customfield-type name="Remaining Estimate At Sprint Start" i18n-name-key="remaining-estimate-at-sprint-start.name" key="remaining-estimate-at-sprint-start" class="ru.some.jira.customfields.RemainingEstimateAtSprintStart">
    <description key="remaining-estimate-at-sprint-start.description">The Remaining Estimate At Sprint Start Plugin</description>
    <resource name="view" type="velocity" location="/templates/customfields/remaining-estimate-at-sprint-start/view.vm"/>
    <resource name="edit" type="velocity" location="/templates/customfields/remaining-estimate-at-sprint-start/edit.vm"/>
    <resource name="xml" type="velocity" location="/templates/customfields/remaining-estimate-at-sprint-start/xml.vm"/>
  </customfield-type>
  <customfield-type name="Issue Comebacks From Testing Count" i18n-name-key="issue-comebacks-from-testing-count.name" key="issue-comebacks-from-testing-count" class="ru.some.jira.customfields.IssueComebacksFromTestingCount">
    <description key="issue-comebacks-from-testing-count.description">The Remaining Estimate At Sprint Start Plugin</description>
    <resource name="view" type="velocity" location="/templates/customfields/issue-comebacks-from-testing-count/view.vm"/>
    <resource name="edit" type="velocity" location="/templates/customfields/issue-comebacks-from-testing-count/edit.vm"/>
    <resource name="xml" type="velocity" location="/templates/customfileds/issue-comebacks-from-testing-count/xml.vm"/>
  </customfield-type>
  <customfield-type name="Issue Responsible Person" i18n-name-key="issue-responsible-person.name" key="issue-responsible-person" class="ru.some.jira.customfields.IssueResponsiblePerson">
    <description key="issue-responsible-person.description">Person, responsible for issue to be done</description>
    <resource name="edit" type="velocity" location="templates/customfields/issue-responsible-person/edit.vm"/>
    <resource name="view" type="velocity" location="templates/customfields/issue-responsible-person/view.vm"/>
    <resource name="xml" type="velocity" location="templates/customfields/issue-responsible-person/xml.vm"/>
  </customfield-type>
</atlassian-plugin>
package ru.some.jira.customfields;

import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.atlassian.jira.issue.customfields.impl.UserCFType;
import com.atlassian.jira.issue.customfields.converters.UserConverter;
import com.atlassian.jira.issue.customfields.manager.GenericConfigManager;
import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager;
import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister;
import com.atlassian.jira.config.properties.ApplicationProperties;
import com.atlassian.jira.project.ProjectManager;
import com.atlassian.jira.template.soy.SoyTemplateRendererProvider;
import com.atlassian.jira.security.groups.GroupManager;
import com.atlassian.jira.security.roles.ProjectRoleManager;
import com.atlassian.jira.bc.user.search.UserSearchService;
import com.atlassian.jira.issue.fields.rest.json.beans.JiraBaseUrls;
import com.atlassian.jira.user.UserHistoryManager;
import com.atlassian.jira.user.UserFilterManager;
import com.atlassian.jira.util.I18nHelper;
import com.atlassian.jira.issue.fields.rest.json.UserBeanFactory;
import com.atlassian.jira.issue.customfields.impl.FieldValidationException;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.fields.config.FieldConfig;
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem;

import javax.inject.Named;
import java.util.List;
import java.util.Map;

@Scanned
public class IssueResponsiblePerson extends UserCFType {
    private static final Logger log = LoggerFactory.getLogger(IssueResponsiblePerson.class);

    @ComponentImport
    private final CustomFieldValuePersister customFieldValuePersister;
    @ComponentImport
    private final GenericConfigManager genericConfigManager;
    @ComponentImport
    private final UserConverter userConverter;
    @ComponentImport
    private final JiraAuthenticationContext jiraAuthenticationContext;
    @ComponentImport
    private final ApplicationProperties applicationProperties;
    @ComponentImport
    private final FieldConfigSchemeManager fieldConfigSchemeManager;
    @ComponentImport
    private final ProjectManager projectManager;
    @ComponentImport
    private final SoyTemplateRendererProvider soyTemplateRendererProvider;
    @ComponentImport
    private final GroupManager groupManager;
    @ComponentImport
    private final ProjectRoleManager projectRoleManager;
    @ComponentImport
    private final UserSearchService userSearchService;
    @ComponentImport
    private final JiraBaseUrls jiraBaseUrls;
    @ComponentImport
    private final UserHistoryManager userHistoryManager;
    @ComponentImport
    private final UserFilterManager userFilterManager;
    @ComponentImport
    private final I18nHelper i18nHelper;
    @ComponentImport
    private final UserBeanFactory userBeanFactory;

    public IssueResponsiblePerson(final CustomFieldValuePersister customFieldValuePersister,
                                  final UserConverter userConverter,
                                  final GenericConfigManager genericConfigManager,
                                  final ApplicationProperties applicationProperties,
                                  final JiraAuthenticationContext jiraAuthenticationContext,
                                  final FieldConfigSchemeManager fieldConfigSchemeManager,
                                  final ProjectManager projectManager,
                                  final SoyTemplateRendererProvider soyTemplateRendererProvider,
                                  final GroupManager groupManager, final ProjectRoleManager projectRoleManager,
                                  final UserSearchService userSearchService,
                                  final JiraBaseUrls jiraBaseUrls,
                                  final UserHistoryManager userHistoryManager,
                                  final UserFilterManager userFilterManager,
                                  final I18nHelper i18nHelper, final UserBeanFactory userBeanFactory) {
        super(customFieldValuePersister, userConverter, genericConfigManager,
                applicationProperties, jiraAuthenticationContext, fieldConfigSchemeManager,
                projectManager, soyTemplateRendererProvider, groupManager, projectRoleManager,
                userSearchService, jiraBaseUrls, userHistoryManager, userFilterManager, i18nHelper,
                userBeanFactory);
        this.customFieldValuePersister = customFieldValuePersister;
        this.genericConfigManager = genericConfigManager;
        this.jiraAuthenticationContext = jiraAuthenticationContext;
        this.applicationProperties = applicationProperties;
        this.userConverter = userConverter;
        this.fieldConfigSchemeManager = fieldConfigSchemeManager;
        this.projectManager = projectManager;
        this.soyTemplateRendererProvider = soyTemplateRendererProvider;
        this.groupManager = groupManager;
        this.projectRoleManager = projectRoleManager;
        this.userSearchService = userSearchService;
        this.jiraBaseUrls = jiraBaseUrls;
        this.userHistoryManager = userHistoryManager;
        this.userFilterManager = userFilterManager;
        this.i18nHelper = i18nHelper;
        this.userBeanFactory = userBeanFactory;
    }

    @Override
    public Map<String, Object> getVelocityParameters(final Issue issue,
                                                     final CustomField field,
                                                     final FieldLayoutItem fieldLayoutItem) {
        final Map<String, Object> map = super.getVelocityParameters(issue, field, fieldLayoutItem);

        // This method is also called to get the default value, in
        // which case issue is null so we can't use it to add currencyLocale
        if (issue == null) {
            return map;
        }

        FieldConfig fieldConfig = field.getRelevantConfig(issue);
        //TODO: add what you need to the map here

        return map;
    }
}
[INFO] [talledLocalContainer] 2016-11-16 16:02:12,348 http-nio-2990-exec-6 ERROR admin 962x17x1 4vx92b 192.168.1.142 /secure/admin/ViewCustomFields.jspa [c.a.plugin.module.PrefixDelegatingModuleFactory] Detected an error instantiating the module via Spring. This usually means that you haven't created a <component-import> for the interface you're trying to use. https://developer.atlassian.com/x/TAEr  for more details.
[INFO] [talledLocalContainer] 2016-11-16 16:02:12,379 http-nio-2990-exec-6 ERROR admin 962x17x1 4vx92b 192.168.1.142 /secure/admin/ViewCustomFields.jspa [c.a.plugin.manager.SafeModuleExtractor] Exception when retrieving plugin module ru.some.jira.timetrack:issue-responsible-person, disabling plugin ru.some.jira.timetrack
[INFO] [talledLocalContainer] com.atlassian.util.concurrent.LazyReference$InitializationException: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ru.some.jira.customfields.IssueResponsiblePerson': Unsatisfied dependency expressed through constructor argument with index 3 of type [com.atlassian.jira.config.properties.ApplicationProperties]: : No qualifying bean of type [com.atlassian.jira.config.properties.ApplicationProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.atlassian.jira.config.properties.ApplicationProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:149)
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:112)
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.ResettableLazyReference.get(ResettableLazyReference.java:92)
[INFO] [talledLocalContainer]   at com.atlassian.jira.plugin.AbstractJiraModuleDescriptor.getModule(AbstractJiraModuleDescriptor.java:175)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.SafeModuleExtractor$1.apply(SafeModuleExtractor.java:46)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.SafeModuleExtractor$1.apply(SafeModuleExtractor.java:38)
[INFO] [talledLocalContainer]   at com.google.common.collect.Iterators$8.transform(Iterators.java:799)
[INFO] [talledLocalContainer]   at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
[INFO] [talledLocalContainer]   at com.google.common.collect.Iterators$7.computeNext(Iterators.java:651)
[INFO] [talledLocalContainer]   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
[INFO] [talledLocalContainer]   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
[INFO] [talledLocalContainer]   at com.google.common.collect.ImmutableCollection$Builder.addAll(ImmutableCollection.java:300)
[INFO] [talledLocalContainer]   at com.google.common.collect.ImmutableList$Builder.addAll(ImmutableList.java:691)
[INFO] [talledLocalContainer]   at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:275)
[INFO] [talledLocalContainer]   at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:226)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.EnabledModuleCachingPluginAccessor.getEnabledModulesByClass(EnabledModuleCachingPluginAccessor.java:175)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.ForwardingPluginAccessor.getEnabledModulesByClass(ForwardingPluginAccessor.java:42)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.ProductPluginAccessor.getEnabledModulesByClass(ProductPluginAccessor.java:17)
[INFO] [talledLocalContainer]   at com.atlassian.extension.plugins.PluginAccessorExtensionProvider.getExtensionsByClassUncacheable(PluginAccessorExtensionProvider.java:35)
[INFO] [talledLocalContainer]   at com.atlassian.extension.provider.base.UncacheableExtensionProvider.getExtensionsByClass(UncacheableExtensionProvider.java:34)
[INFO] [talledLocalContainer]   at com.atlassian.extension.base.CachingExtensionAccessor.lambda$getExtensionsByClassSupplier$1(CachingExtensionAccessor.java:52)
[INFO] [talledLocalContainer]   at com.atlassian.extension.base.CachingExtensionAccessor.getExtensionsByClass(CachingExtensionAccessor.java:35)
[INFO] [talledLocalContainer]   at com.atlassian.extension.plugins.ExtensionAccessingPluginAccessor.getEnabledModulesByClass(ExtensionAccessingPluginAccessor.java:48)
[INFO] [talledLocalContainer]   at com.atlassian.jira.plugin.customfield.CustomFieldTypeModuleDescriptorsImpl.getCustomFieldTypes(CustomFieldTypeModuleDescriptorsImpl.java:29)
[INFO] [talledLocalContainer]   at com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldTypes(DefaultCustomFieldManager.java:236)
[INFO] [talledLocalContainer]   at com.atlassian.jira.web.action.admin.customfields.ViewCustomFields.isCustomFieldTypesExist(ViewCustomFields.java:56)
[INFO] [talledLocalContainer]   ... 3 filtered
[INFO] [talledLocalContainer]   at java.lang.reflect.Method.invoke(Method.java:498)
[INFO] [talledLocalContainer]   at webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:70)
[INFO] [talledLocalContainer]   at webwork.util.InjectionUtils.invoke(InjectionUtils.java:56)
[INFO] [talledLocalContainer]   at webwork.util.ValueStack.findValue(ValueStack.java:417)
[INFO] [talledLocalContainer]   at webwork.util.SimpleTest.test(SimpleTest.java:408)
[INFO] [talledLocalContainer]   at webwork.util.ValueStack.test(ValueStack.java:157)
[INFO] [talledLocalContainer]   at webwork.view.taglib.IfTag.doStartTag(IfTag.java:40)
[INFO] [talledLocalContainer]   at jsp.secure.admin.views.customfields.customfields_jsp._jspx_meth_ww_005fif_005f0(customfields_jsp.java:210)
[INFO] [talledLocalContainer]   at jsp.secure.admin.views.customfields.customfields_jsp._jspService(customfields_jsp.java:111)
[INFO] [talledLocalContainer]   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
[INFO] [talledLocalContainer]   at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
[INFO] [talledLocalContainer]   ... 18 filtered
[INFO] [talledLocalContainer]   at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:37)
[INFO] [talledLocalContainer]   ... 74 filtered
[INFO] [talledLocalContainer]   at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
[INFO] [talledLocalContainer]   ... 36 filtered
[INFO] [talledLocalContainer]   at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
[INFO] [talledLocalContainer]   ... 74 filtered
[INFO] [talledLocalContainer]   at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59)
[INFO] [talledLocalContainer]   ... 42 filtered
[INFO] [talledLocalContainer]   at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
[INFO] [talledLocalContainer]   ... 89 filtered
[INFO] [talledLocalContainer]   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[INFO] [talledLocalContainer]   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[INFO] [talledLocalContainer]   at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
[INFO] [talledLocalContainer]   at java.lang.Thread.run(Thread.java:745)
[INFO] [talledLocalContainer] Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ru.some.jira.customfields.IssueResponsiblePerson': Unsatisfied dependency expressed through constructor argument with index 3 of type [com.atlassian.jira.config.properties.ApplicationProperties]: : No qualifying bean of type [com.atlassian.jira.config.properties.ApplicationProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.atlassian.jira.config.properties.ApplicationProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1139)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1042)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:342)
[INFO] [talledLocalContainer]   ... 2 filtered
[INFO] [talledLocalContainer]   at java.lang.reflect.Method.invoke(Method.java:498)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.osgi.spring.DefaultSpringContainerAccessor.createBean(DefaultSpringContainerAccessor.java:97)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.module.ClassPrefixModuleFactory.createModule(ClassPrefixModuleFactory.java:35)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.module.PrefixDelegatingModuleFactory.createModule(PrefixDelegatingModuleFactory.java:88)
[INFO] [talledLocalContainer]   at com.atlassian.jira.plugin.AbstractJiraModuleDescriptor.createModule(AbstractJiraModuleDescriptor.java:187)
[INFO] [talledLocalContainer]   at com.atlassian.jira.plugin.AbstractJiraModuleDescriptor$1.create(AbstractJiraModuleDescriptor.java:64)
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.ResettableLazyReference$InternalReference.create(ResettableLazyReference.java:182)
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:325)
[INFO] [talledLocalContainer]   at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:143)
[INFO] [talledLocalContainer]   ... 381 more
[INFO] [talledLocalContainer] Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.atlassian.jira.config.properties.ApplicationProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813)
[INFO] [talledLocalContainer]   at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)

com.atlassian.jira.config.properties.ApplicationProperties are not injected. What can I use instead of @ComponentImport?

How to resolve this?

Versions are provided in pom.xml

2 answers

1 accepted

Comments for this post are closed

Community moderators have prevented the ability to post new answers.

Post a new question

1 vote
Answer accepted
bobizma November 17, 2016
@Autowired
public IssueResponsiblePerson(@ComponentImport final CustomFieldValuePersister customFieldValuePersister,
                              @ComponentImport final UserConverter userConverter,
                              @ComponentImport final GenericConfigManager genericConfigManager,
                              @JiraImport("com.atlassian.jira.config.properties.ApplicationProperties") final ApplicationProperties applicationProperties,
                              @ComponentImport final JiraAuthenticationContext jiraAuthenticationContext,
                              @ComponentImport final FieldConfigSchemeManager fieldConfigSchemeManager,
                              @ComponentImport final ProjectManager projectManager,
                              @ComponentImport final SoyTemplateRendererProvider soyTemplateRendererProvider,
                              @ComponentImport final GroupManager groupManager, @ComponentImport final ProjectRoleManager projectRoleManager,
                              @ComponentImport final UserSearchService userSearchService,
                              @ComponentImport final JiraBaseUrls jiraBaseUrls,
                              @ComponentImport final UserHistoryManager userHistoryManager,
                              @ComponentImport final UserFilterManager userFilterManager,
                              @ComponentImport final I18nHelper i18nHelper, @ComponentImport final UserBeanFactory userBeanFactory) {
    super(customFieldValuePersister, userConverter, genericConfigManager,
            applicationProperties, jiraAuthenticationContext, fieldConfigSchemeManager,
            projectManager, soyTemplateRendererProvider, groupManager, projectRoleManager,
            userSearchService, jiraBaseUrls, userHistoryManager, userFilterManager, i18nHelper,
            userBeanFactory);
    this.customFieldValuePersister = customFieldValuePersister;
    this.genericConfigManager = genericConfigManager;
    this.jiraAuthenticationContext = jiraAuthenticationContext;
    this.applicationProperties = applicationProperties;
    this.userConverter = userConverter;
    this.fieldConfigSchemeManager = fieldConfigSchemeManager;
    this.projectManager = projectManager;
    this.soyTemplateRendererProvider = soyTemplateRendererProvider;
    this.groupManager = groupManager;
    this.projectRoleManager = projectRoleManager;
    this.userSearchService = userSearchService;
    this.jiraBaseUrls = jiraBaseUrls;
    this.userHistoryManager = userHistoryManager;
    this.userFilterManager = userFilterManager;
    this.i18nHelper = i18nHelper;
    this.userBeanFactory = userBeanFactory;
}

That worked for me

0 votes
Volodymyr Krupach
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 16, 2016

Hi Oleg,

All classes that are part of JIRA API including ApplicationProperties should be annotated with @Autowired.

@ComponentImport should used for for classes that come from other addons. Please see spring-scanner docs for more details.

bobizma November 16, 2016

That didn't worked for me. In this case I've got 

[INFO] [talledLocalContainer] com.atlassian.util.concurrent.LazyReference$InitializationException: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ru.some.jira.customfields.IssueResponsiblePerson': Unsatisfied dependency expressed through constructor argument with index 1 of type [com.atlassian.jira.issue.customfields.converters.UserConverter]: : No qualifying bean of type [com.atlassian.jira.issue.customfields.converters.UserConverter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.atlassian.jira.issue.customfields.converters.UserConverter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Followed https://answers.atlassian.com/questions/32507480 answer.

TAGS
AUG Leaders

Atlassian Community Events