WELD-001408 Неудовлетворительные зависимости при введении EJB, которые реализуют интерфейсы
Вот ситуация.
У меня есть следующие интерфейсы:
public interface Parent { }
public interface ChildOne extends Parent { }
public interface ChildTwo extends Parent { }
и 2 EJBs:
@Stateless
public class FirstBean implements ChildOne { }
@Stateless
public class SecondBean implements ChildTwo { }
И также этот CDI Bean:
@Named
@SessionScoped
public class TestController implements Serializable {
@Inject
private FirstBean firstBean;
@Inject
private SecondBean secondBean;
}
При попытке развернуть это на Glassfish 3.1 я получаю следующее исключение:
Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean]
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean]
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305)
Когда оба EJB реализуют интерфейс Parent
, исключение одно и то же.
Кроме того, я попытался добавить квалификаторы, но это ничего не изменило.
Ответы
Ответ 1
Я просто играл с вашей конструкцией, читал немного сваривания document и выяснил следующее.
Вы используете EJB, которые реализуют интерфейс, поэтому представление без интерфейса больше невозможно (очевидно), но вы пытаетесь напрямую получить доступ к реализации. Как только вы объявите его EJB, вы должны иметь в виду конвенции. Итак, если вы определяете интерфейс, вы должны использовать его для доступа к EJB. Изменив его на следующее, вы должны:
@Inject
private ChildOne firstBean;
Доступ к реализации, даже если интерфейс определен, просто возможен для простого управляемого CDI Beans (классы без аннотаций @Stateless/@Stateful). Так что избавитесь от вашей аннотации, и это сработает.
Просто для вашей информации, если вы используете Glassfish. Если вы придерживаетесь своих EJB и попытаетесь получить доступ к методу родительских интерфейсов, вы столкнетесь с этим ошибкой/исключением.
Ответ 2
Лучше поздно, чем никогда:
Аннотирование SLSB с использованием @LocalBean
работает для меня с JBoss AS 7.1.1. Мне не нравится идея создания интерфейса без добавленной стоимости.
Используя ваш пример:
@Stateless
@LocalBean
public class FirstBean implements ChildOne { }
@Stateless
@LocalBean
public class SecondBean implements ChildTwo { }
Ответ 3
Вы пытались использовать аннотацию @EJB, а не аннотацию CDI @inject?
например.
@Named
@SessionScoped
public class TestController implements Serializable {
@EJB
private FirstBean firstBean;
@EJB
private SecondBean secondBean;
}