In Payara 5, Jakarta EE 8, I try to inject all the qualified beans and then select a specific one using a qualifier as shown right below:
@Stateless
public class ScheduledTaskExecutor {
@Inject
@Any
private Instance<QCScheduledTask> scheduledTasks;
@Asynchronous
public void executeTask(final String taskName, final String jobID) {
final ScheduledTaskQualifier qualifier = new ScheduledTaskQualifier(taskName);
final QCScheduledTask scheduler = scheduledTasks.select(qualifier).get();
scheduler.execute(jobID);
}
}
public interface QCScheduledTask {
public void execute(final String jobID);
}
The abstract class which extends the interface along with an implementer:
public abstract class AbstractQCScheduledTask implements QCScheduledTask {
private String jobID;
protected abstract void executeTask();
public void execute(final String jobID) {
//
}
protected void updateStatus(final TaskStatus status) {
//
}
}
@Stateless
@QCScheduled(taskName = "TASK_BACKGROUND_JOB_EVALUATION")
public class BackgroundJobEvaluationExecuter extends AbstractQCScheduledTask {
@Inject
private BackgroundJobEvaluator backgroundJobEvaluator;
@Override
protected void executeTask() {
}
}
And the qualifier
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QCScheduled {
/**
* Task name discriminator
*
* @return
*/
String taskName();
}
The result is unsatisfied dependencies error.
The same code works on JavaEE 7 application server. I could not find any difference in the JakartaEE 8 specification, besides, I think that there should not be a restriction on using interfaces and abstract classes together for a runtime resolution of the desired bean implementer.
Annotate the interface QCScheduledTask
with @jakarta.ejb.Local