WELD-001408 Неудовлетворенные зависимости при внедрении EJB, которые реализуют интерфейсы - PullRequest
13 голосов
/ 27 января 2012

Вот ситуация.

У меня есть следующие интерфейсы:

public interface Parent { }
public interface ChildOne extends Parent { }
public interface ChildTwo extends Parent { }

и 2 EJB:

@Stateless
public class FirstBean implements ChildOne { }

@Stateless
public class SecondBean implements ChildTwo { }

А также этот CDI Боб:

@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, исключение одинаково.
Кроме того, я попытался добавить квалификаторы, но это ничего не изменило.

Ответы [ 3 ]

21 голосов
/ 28 января 2012

Я просто поигрался с вашей конструкцией, прочитал немного сварного шва document и обнаружил следующее.

Вы используете EJB, которые реализуют интерфейс, поэтому представление без интерфейса больше невозможно (очевидно), но вы пытаетесь получить прямой доступ к реализации.Как только вы объявляете его как EJB, вы должны помнить об условностях.Итак, если вы определяете интерфейс, вы должны использовать его, чтобы получить доступ к EJB.Изменение на следующее должно сработать:

@Inject
private ChildOne firstBean;

Доступ к реализации, даже если интерфейс определен, возможен только для простых управляемых компонентов CDI (классов без аннотаций @ Stateless / @ Stateful).Так что избавьтесь от вашей аннотации, и она сработает.

Только для вашей информации, если вы используете Glassfish.Если вы придерживаетесь своих EJB и пытаетесь получить доступ к методу родительских интерфейсов, вы столкнетесь с этой ошибкой / исключением.

7 голосов
/ 22 июня 2012

Лучше поздно, чем никогда:

Дополнительная пометка SLSB с @LocalBean работает для меня с JBoss AS 7.1.1.Мне не нравится идея создания интерфейса без добавленной стоимости.

Используя ваш пример:

@Stateless
@LocalBean
public class FirstBean implements ChildOne { }

@Stateless
@LocalBean
public class SecondBean implements ChildTwo { }
0 голосов
/ 27 января 2012

Вы пытались использовать аннотацию @EJB вместо аннотации CDI @inject?

* 1003 Е.Г. *

@Named
@SessionScoped
public class TestController implements Serializable {

    @EJB
    private FirstBean firstBean;

    @EJB
    private SecondBean secondBean;
}
...