在Payara 5, Jakarta EE 8中,我尝试注入所有合格的bean,然后使用限定符选择一个特定的bean,如下所示:
@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);
}
与实现者一起扩展接口的抽象类:
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() {
}
}
和限定词
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QCScheduled {
/**
* Task name discriminator
*
* @return
*/
String taskName();
}
结果为未满足的依赖项错误。
相同的代码在JavaEE 7应用服务器上工作。我在javartaee 8规范中找不到任何差异,此外,我认为不应该限制将接口和抽象类一起用于所需bean实现的运行时解析。
用@jakarta.ejb.Local
标注接口QCScheduledTask