Hi everyone, I'm writing a custom Jira plugin of type Service.
I have
@Named
@ExportAsService
public class ENGSLAService extends AbstractService {
@JiraImport
private JqlQueryParser jqlQueryParser;
@JiraImport
private SearchService searchService;
private InsightReader insightReader;
@Inject
public ENGSLAService(JqlQueryParser jqlQueryParser, SearchService searchService) {
this.jqlQueryParser = jqlQueryParser;
this.searchService = searchService;
this.insightReader = ComponentAccessor.getOSGiComponentInstanceOfType(InsightReader.class);
log.warn("insightReader is " + insightReader);
}
...
}
@JiraComponent
public class InsightReader {
@JiraImport
private ObjectFacade objectFacade;
@JiraImport
private IQLFacade iqlFacade;
...
}
Basically I don't know how I can initialize a InsightReader's object inside my ENGSLAService constructor. I tryied different arrangements with annotations and non-empty constructor in InsightReader's class but nothing seems to work. Sometimes I get a PicoContainer Exception, sometimes (like for the above code) the object of type InsightReader is null after invoking ComponentAccessor.getOSGiComponentInstanceOfType. I probably messed up with Spring/OSGi annotations. Could you please suggest how to make it work?
Thank you
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi Martin,
I did it another way:
@Autowired
public ENGSLAService(JqlQueryParser jqlQueryParser, SearchService searchService) {
this.jqlQueryParser = jqlQueryParser;
this.searchService = searchService;
this.pluginSettings = null;
try {
Class objectFacadeClass = ComponentAccessor.getPluginAccessor().getClassLoader().loadClass("com.riadalabs.jira.plugins.insight.channel.external.api.facade.ObjectFacade");
Class iqlFacadeClass = ComponentAccessor.getPluginAccessor().getClassLoader().loadClass("com.riadalabs.jira.plugins.insight.channel.external.api.facade.IQLFacade");
ObjectFacade objectFacade = (ObjectFacade) ComponentAccessor.getOSGiComponentInstanceOfType (objectFacadeClass);
IQLFacade iQLFacade = (IQLFacade) ComponentAccessor.getOSGiComponentInstanceOfType (iqlFacadeClass);
this.insightReader = new InsightReader (objectFacade,iQLFacade);
} catch (ClassNotFoundException e) {
log.error("Cannot initialize InsightReader Object", e);
}
try {
Class pluginSettingsFactoryClass = ComponentAccessor.getPluginAccessor().getClassLoader().loadClass("com.atlassian.sal.api.pluginsettings.PluginSettingsFactory");
pluginSettingsFactory = (PluginSettingsFactory) ComponentAccessor.getOSGiComponentInstanceOfType (pluginSettingsFactoryClass);
pluginSettings = pluginSettingsFactory.createSettingsForKey(ENGSLARESTServiceConfig.class.getName());
}
catch (ClassNotFoundException e) {
log.error("Cannot initialize PluginSettingsFactory Object", e);
}
}
Of course after adding this
public InsightReader(ObjectFacade objectFacade, IQLFacade iqlFacade) {
this.objectFacade = objectFacade;
this.iqlFacade = iqlFacade;
}
To InsightReader.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
@Giorgia Fineschi ok, I hope it works for you. My best practice is to not to use ComponentAccessor if it is not necessary.
In my opinion, you should create InsightReader service as "service" or "component" with objectFacade and iqlFacade to be injected by OSGi.
It should be someting like:
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.riadalabs.jira.plugins.insight.channel.external.api.facade.ObjectFacade
import com.riadalabs.jira.plugins.insight.channel.external.api.facade.IQLFacade
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class InsightReader{
private final ObjetFacade objectFacade;
private final IQLFacade iqlFacade;
@Autowired
public InsightReader(@ComponentImport ObjectFacade objectFacade, @ComponentImport IQLFacade iqlFacade){
this.objectFacade = objectFacade;
this.iqlFacade = iqlFacade;
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I know it's bad. I don't like using ComponentAccessor either but I had to make my code work and that workaround seems ok.
I'm still working on this project so I can refactor. However it will take me some time since I have to complete another part before making these changes. I'll let you know in the next weeks.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Sure, no problem :). Good luck with the project :)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.