I try to update my Jira Plugin. The Spring Scanner Annotations now seem to be deprecated. I use spring scanner 3.0.4 and jira 10.3.9
The problem is: I dont see any updates on how ActiveObjects work but my data isnt fetched anymore:
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. Dependency annotations: {} at io.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:156) at io.atlassian.util.concurrent.LazyReference.get(LazyReference.java:116) at com.atlassian.plugin.servlet.DefaultServletModuleManager.getInstance(DefaultServletModuleManager.java:455) at com.atlassian.plugin.servlet.DefaultServletModuleManager.getServlet(DefaultServletModuleManager.java:430) at com.atlassian.plugin.servlet.DefaultServletModuleManager.getServlet(DefaultServletModuleManager.java:238) at com.atlassian.jira.plugin.servlet.ServletModuleContainerServlet.getServletDetails(ServletModuleContainerServlet.java:115) at com.atlassian.jira.plugin.servlet.ServletModuleContainerServlet.service(ServletModuleContainerServlet.java:65) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ... 48 filtered at com.atlassian.jira.plugin.mobile.web.filter.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:61) ... 4 filtered at com.atlassian.jira.plugin.mobile.login.MobileLoginSuccessFilter.doFilter(MobileLoginSuccessFilter.java:56) ... 3 filtered at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:56) ... 8 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:23) ... 4 filtered at com.atlassian.app.usage.core.features.user.interaction.servlet.filter.CapturingServletFilter.doFilter(CapturingServletFilter.kt:40) ... 3 filtered at com.atlassian.app.usage.core.features.common.usage.rest.filter.CapturingRestFilter.doFilter(CapturingRestFilter.kt:38) ... 23 filtered at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59) ... 27 filtered at com.atlassian.theme.filter.DefaultRequestOverrideServletFilter.doFilter(DefaultRequestOverrideServletFilter.java:72) ... 3 filtered at com.atlassian.oauth2.scopes.web.ReadWriteScopeFilter.doFilter(ReadWriteScopeFilter.java:48) ... 3 filtered at com.atlassian.troubleshooting.thready.filter.AbstractThreadNamingFilter.doFilter(AbstractThreadNamingFilter.java:46) ... 22 filtered at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:68) ... 1 filtered at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:66) ... 16 filtered at com.atlassian.pats.web.filter.TokenBasedAuthenticationFilter.doFilter(TokenBasedAuthenticationFilter.java:84) ... 3 filtered at com.atlassian.oauth2.provider.core.web.AccessTokenFilter.doFilter(AccessTokenFilter.java:97) ... 23 filtered at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:32) ... 5 filtered at com.atlassian.plugins.authentication.sso.web.filter.loginform.DisableNativeLoginAuthFilter.doFilterInternal(DisableNativeLoginAuthFilter.java:73) at com.atlassian.plugins.authentication.sso.web.filter.AbstractJohnsonAwareFilter.doFilter(AbstractJohnsonAwareFilter.java:29) ... 3 filtered at com.atlassian.plugins.authentication.basicauth.filter.DisableBasicAuthFilter.doFilter(DisableBasicAuthFilter.java:79) ... 3 filtered at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:39) ... 8 filtered at com.atlassian.web.servlet.plugin.ThreadIdFilter.doFilter(ThreadIdFilter.java:21) ... 4 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:23) ... 4 filtered at com.atlassian.troubleshooting.thready.filter.AbstractThreadNamingFilter.doFilter(AbstractThreadNamingFilter.java:46) ... 3 filtered at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:38) ... 29 filtered at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:27) ... 24 filtered at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:840) Caused by: 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. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:794) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:220) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:378) at jdk.internal.reflect.GeneratedMethodAccessor176.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.atlassian.plugin.osgi.spring.DefaultSpringContainerAccessor.createBean(DefaultSpringContainerAccessor.java:130) at com.atlassian.plugin.module.ClassPrefixModuleFactory.createModule(ClassPrefixModuleFactory.java:37) at com.atlassian.plugin.module.PrefixDelegatingModuleFactory.createModule(PrefixDelegatingModuleFactory.java:92) at com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor.getModule(ServletModuleDescriptor.java:42) at com.atlassian.plugin.servlet.DelegatingPluginServlet.<init>(DelegatingPluginServlet.java:30) at com.atlassian.plugin.servlet.DefaultServletModuleManager$LazyLoadedServletReference.create(DefaultServletModuleManager.java:557) at com.atlassian.plugin.servlet.DefaultServletModuleManager$LazyLoadedServletReference.create(DefaultServletModuleManager.java:538) at io.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:332) at io.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:150) ... 309 more
My BookedHoursImpl.java:
@ComponentCoComponentCoComponentCoComponen@NamedCo@Na@Namededponent
@Named(“bookedHoursTr@ExportAsServ@Exp@ExportAsServicertAsServicecensactions”)
@ExportAsService({ BookedHoursTransactions.class })
public class BookedHoursTransactionsImpl implements BookedHoursTransactions {
private ActiveObjects ao;
@Inject
public BookedHoursTransactionsImpl(@ComponentImport ActiveObjects ao) {
this.ao = ao;
}
….
My Sure.java, I also tried with @ComponentImport but it didn’t work either
import java.io.IOException;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
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;
@NamedNamed
public class Sure extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String TEMPLATE_ADMIN = “sure_home_admin.vm”;
private static final String TEMPLATE_USER = “sure_home_user.vm”;
Map<String, Object> context;
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 bookedHoursTransactio@Injects;
@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;
}