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;
}