Проблема в том, что с MyTask в качестве EJB-компонента, реализующего Callable , вы удалили сам класс MyTask из "bean-типа" этого bean-компонентаЭто означает, что он не может быть введен в @Inject MyTask xxx
«клиент», согласно правилам в спецификации CDI 2.0 :
18.2.2.Типы компонентов сессионного компонента
Неограниченный набор типов компонентов для сессионного компонента содержит все локальные интерфейсы компонента и их суперинтерфейсы.Если сессионный компонент имеет представление без интерфейса, неограниченный набор типов компонентов содержит класс компонента и все суперклассы.Кроме того, java.lang.Object является типом bean-компонента для каждого сессионного компонента.
Именно поэтому Weld не находит действительный компонент MyTask для удовлетворения инъекции в ваш TestBean client.
Вы можете предоставить MyTask EJB представление без интерфейса, добавив аннотацию @LocalBean
, например:
@Stateless
@LocalBean
public class MyTask implements Callable<String> {
Или вы можете удалить implements Callable
и рефакторинг, например:
public class MyTask {
@Inject
MyBean myBean;
MyCallable callable = new MyCallable();
public Callable getCallable() {
return callable;
}
private class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("MyTask called");
myBean.print();
return "Task called";
}
}
}
public class TestBean {
// ...
MyTask task = myTaskInstance.get();
tasks.add(task.getCallable())
// ...
}
См. здесь для быстрого ознакомления с представлением без интерфейса, а также this сообщение для дальнейшего обсуждения.