EJB без сохранения состояния внедряет интерфейсный сбой

Wildfly 8.2.0

у меня есть Stateless EJB и интерфейс.

@Local
@Stateless
public class Bean implements IBean{
...
}

@Local
public interface IBean {
...
}

Но я получаю WELD ошибку. Если Бин не реализует интерфейс, ошибок нет. Согласно /questions/16908719/mozhet-li-ejb-komponent-realizovyivat-neskolko-interfejsov/16908735#16908735 и https://blogs.oracle.com/arungupta/entry/what_s_new_in_ejb не должно быть ошибок.

Ошибка:

WELD-001408: Unsatisfied dependencies for type Bean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private mypackage.anotherBean.bean

Обновление: я перепробовал все возможные комбинации с Local но это не помогает Только если интерфейс удален, ошибки нет.

@Stateless
public class Bean implements IBean{
...
}

@Local
public interface IBean {
...
}

//*****************************
@Stateless
public class Bean implements IBean{
...
}

public interface IBean {
...
}
//************************************
@Local
@Stateless
public class Bean implements IBean{
...
}

public interface IBean {
...
}

2 ответа

Решение

Когда вы хотите внедрить компонент EJB (используя @EJB) или CDI (используя @Inject) контейнер вы объявляете переменную с типом интерфейса. Конкретная реализация заявленного интерфейса обнаруживается контейнером при развертывании приложения. В вашем примере проблема не в аннотациях, а в введении объявленного типа (Bean вместо IBean).

Вы должны удалить @Local из бобов.

@Stateless
public class Bean implements IBean{
...
}

Поскольку вы определяете 2 возможных локальных WELD, не знаете, какой из них использовать.

Документация оракула показывает это тоже с @Remote интерфейс:

@Remote
public interface Foo { . . . }

@Stateless
public class Bean implements Foo, Bar {
    . . .
}
Другие вопросы по тегам