Quick Reload fails with: IllegalArgumentException: Required 'bundleContext' property was not set

Hello everyone,

Recently I added the following class to my Jira plugin:

package space.smilingmonkey.jira.plugins.network;

import com.atlassian.sal.api.net.RequestFactory;

public class SALHttpClient extends AbstractHttpClient {
    public SALHttpClient(final RequestFactory<?> requestFactory) {
        this.requestFactory = requestFactory;
    }
    // bla bla bla...
}

Also I added a class for importing the OSGI service ‘RequestFactory’ following the tutorial:
“[Spring Java configuration - converting from Spring Scanner](https://Convert a plugin from Atlassian Spring Scanner to Spring Java configuration)”

package space.smilingmonkey.jira.plugins.beans;

import com.atlassian.plugins.osgi.javaconfig.configs.beans.ModuleFactoryBean;
import com.atlassian.plugins.osgi.javaconfig.configs.beans.PluginAccessorBean;
import com.atlassian.sal.api.net.RequestFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import static com.atlassian.plugins.osgi.javaconfig.OsgiServices.importOsgiService;

@Configuration
@Import({
        ModuleFactoryBean.class,
        PluginAccessorBean.class
})
public class SpringBeans {
    @Bean
    public RequestFactory<?> requestFactory() {
        return importOsgiService(RequestFactory.class);
    }
}

Finally I created the file called plugin-context.xml in the folder META-INF.spring with this content:

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="space.smilingmonkey.jira.plugins.beans"/>
</beans>

All of this works like a charm. The dependency of RequestFactory is resolved successfully and I can use my class SALHttplient. But if use atlassian-debug and after some code modifications I run atlassian-package so re-charge the app using the quick reload feature, the next the SALHttpClient is invoked, it fails with the following error in runtime:

2022-07-09 18:48:48,254+0200 http-nio-2990-exec-1 WARN admin 1128x2985x1 1ycgg46 0:0:0:0:0:0:0:1 /rest/insight/1.0/import/start/1/isots [o.s.context.annotation.AnnotationConfigApplicationContext] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'moduleFactory' defined in com.atlassian.plugins.osgi.javaconfig.configs.beans.ModuleFactoryBean: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.atlassian.plugin.module.ModuleFactory]: Factory method 'moduleFactory' threw exception; nested exception is org.springframework.beans.factory.BeanInitializationException: Required 'bundleContext' property was not set.; nested exception is java.lang.IllegalArgumentException: Required 'bundleContext' property was not set.
2022-07-09 18:48:48,265+0200 http-nio-2990-exec-1 ERROR admin 1128x2985x1 1ycgg46 0:0:0:0:0:0:0:1 /rest/insight/1.0/import/start/1/isots [c.r.j.p.i.s.imports.common.DefaultImportService] Error when importing objects with DefaultImportService
com.riadalabs.jira.plugins.insight.common.exception.ValidationInsightException: ValidationInsightException: Validation errors were found: importModuleError: ErrorMessage{i18nKey='Error creating bean with name 'moduleFactory' defined in com.atlassian.plugins.osgi.javaconfig.configs.beans.ModuleFactoryBean: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.atlassian.plugin.module.ModuleFactory]: Factory method 'moduleFactory' threw exception; nested exception is org.springframework.beans.factory.BeanInitializationException: Required 'bundleContext' property was not set.; nested exception is java.lang.IllegalArgumentException: Required 'bundleContext' property was not set.', parameters=[], additionalMessage=null};
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService.testModuleConnection(DefaultImportService.java:428)
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService.testConnectionWithConfiguration(DefaultImportService.java:359)
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService.testConnection(DefaultImportService.java:348)
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService.testConnection(DefaultImportService.java:324)
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService._startImport(DefaultImportService.java:579)
        at com.riadalabs.jira.plugins.insight.services.imports.common.DefaultImportService.startImportForSpecificOTs(DefaultImportService.java:285)
        at com.riadalabs.jira.plugins.insight.channel.web.api.rest.services.imports.ImportResource.startImportSpecificOTs(ImportResource.java:123)
        ... 3 filtered
        at java.lang.reflect.Method.invoke(Method.java:498)
        ... 19 filtered
        at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:160)
        ... 1 filtered
        at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:70)
        ... 32 filtered
        at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:55)
        ... 8 filtered
        at com.atlassian.jira.plugin.mobile.web.filter.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:59)
        ... 4 filtered
        at com.atlassian.jira.plugin.mobile.login.MobileLoginSuccessFilter.doFilter(MobileLoginSuccessFilter.java:54)
        ... 3 filtered
        at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:55)
        ... 8 filtered
        at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
        ... 24 filtered
        at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59)
        ... 22 filtered
        at com.atlassian.ratelimiting.internal.filter.RateLimitFilter.doFilter(RateLimitFilter.java:73)
        ... 3 filtered
        at com.atlassian.troubleshooting.thready.filter.AbstractThreadNamingFilter.doFilter(AbstractThreadNamingFilter.java:46)
        ... 17 filtered
        at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66)
        ... 1 filtered
        at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64)
        ... 16 filtered
        at com.atlassian.plugins.rest.module.servlet.RestSeraphFilter.doFilter(RestSeraphFilter.java:38)
        ... 3 filtered
        at com.atlassian.pats.web.filter.TokenBasedAuthenticationFilter.doFilter(TokenBasedAuthenticationFilter.java:83)
        ... 19 filtered
        at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
        ... 5 filtered
        at com.atlassian.plugins.authentication.impl.basicauth.filter.DisableBasicAuthFilter.doFilter(DisableBasicAuthFilter.java:70)
        ... 3 filtered
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:215)
        at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.rteInvoke(ReentrantThreadLocalBasedCodeContext.java:136)
        at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.runOutOfContext(ReentrantThreadLocalBasedCodeContext.java:89)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.runOutOfCustomerContext(CustomerContextServiceImpl.java:47)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:206)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:134)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:123)
        ... 4 filtered
        at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:37)
        ... 8 filtered
        at com.atlassian.ratelimiting.internal.filter.RateLimitPreAuthFilter.doFilter(RateLimitPreAuthFilter.java:71)
        ... 3 filtered
        at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
        ... 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:36)
        ... 26 filtered
        at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
        ... 24 filtered
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

Any idea about what is the cause? It is annoying to restart the server every time I change something in the code.

Thank you!