Hi everyone,
I’m developing a Jira Server/Data Center plugin and I’m stuck with Spring Scanner service injection. I keep getting NoSuchBeanDefinitionException although I think I have annotated everything correctly.
Environment
Trace
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'de.jiraplugin.Sure':
Unsatisfied dependency expressed through constructor parameter 0;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'de.jiraplugin.BookedHoursTransactions' available:
expected at least 1 bean which qualifies as autowire candidate.
Relevant Code
Service interface
import com.atlassian.activeobjects.external.ActiveObjects;
import com.atlassian.plugin.spring.scanner.annotation.component.Component;
import com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import javax.inject.Inject;
@Component
@ExportAsService({BookedHoursTransactions.class})
public class BookedHoursTransactionsImpl implements BookedHoursTransactions {
private final ActiveObjects ao;
@Inject
public BookedHoursTransactionsImpl(@ComponentImport ActiveObjects ao) {
this.ao = ao;
}
@Override
public void doSomething() {
// ...
}
}
Servlet
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.atlassian.jira.bc.issue.search.SearchService;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.link.IssueLinkManager;
import com.atlassian.jira.issue.worklog.WorklogManager;
import com.atlassian.jira.security.groups.GroupManager;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.atlassian.sal.api.auth.LoginUriProvider;
import com.atlassian.sal.api.user.UserManager;
import com.atlassian.templaterenderer.TemplateRenderer;
import com.atlassian.webresource.api.assembler.PageBuilderService;
import com.google.common.collect.Maps;
import de.jiraplugin.issues.DataGetter;
import de.jiraplugin.issues.Sponsor;
@Named
public class Sure extends HttpServlet {
...
private SearchService searchService;
private TemplateRenderer templateRenderer;
private final UserManager userManager;
private final CustomFieldManager customFieldManager;
private final WorklogManager worklogManager;
private final IssueLinkManager issueLinkManager;
private final GroupManager groupManager;
private final LoginUriProvider loginUriProvider;
private final PageBuilderService pageBuilderService;
private final BookedHoursTransactions bookedHoursTransactions;
@Inject
public Sure(BookedHoursTransactions bookedHoursTransactions) {
super();
this.searchService = ComponentAccessor.getComponent(SearchService.class);
this.templateRenderer = ComponentAccessor.getComponent(TemplateRenderer.class);
this.userManager = ComponentAccessor.getComponent(UserManager.class);
this.customFieldManager = ComponentAccessor.getComponent(CustomFieldManager.class);
this.worklogManager = ComponentAccessor.getComponent(WorklogManager.class);
this.issueLinkManager = ComponentAccessor.getComponent(IssueLinkManager.class);
this.groupManager = ComponentAccessor.getComponent(GroupManager.class);
this.loginUriProvider = ComponentAccessor.getComponent(LoginUriProvider.class);
this.pageBuilderService = ComponentAccessor.getComponent(PageBuilderService.class);
this.bookedHoursTransactions = bookedHoursTransactions;
}