Я изучаю как CDI, так и EJB. Глядя на объяснения Weld о КДИ (http://docs.jboss.org/weld/reference/latest/en-US/html/beanscdi.html), он утверждает, чтоне может вводить (@EJB) ejb, используя свой суперкласс
Неограниченное множество типов боба для сессионного компонента содержит все локальные интерфейсы бина и их суперинтерфейсов. Если в сеансовом компоненте есть локальное представление класса компонента, неограниченный набор типов компонентов содержит класс bean и все суперклассы. Кроме того, java.lang.Object является bean-типом каждого сеансового компонента. Но удаленные интерфейсы не включены в набор типов компонентов.
Я пытаюсь проверить эту конкретную часть
неограниченный набор типов бобов содержит класс боб и все Суперклассов
Таким образом, я создал два EJBs: ReferencedEJB, который проходит DummyParent и MainEJB, который имеет ссылку на EJB
DummyParent.java
package com.etm.ejbtest;
public abstract class DummyParent {
public DummyParent() {
}
public void sayHi() {
System.out.println("Hi!");
}
}
ReferencedEJB.java
package com.etm.ejbtest;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class ReferencedEJB extends DummyParent {
public ReferencedEJB() {
}
@PostConstruct
protected void init() {
System.out.println("init of ReferencedEJB");
}
}
MainEJB.java
package com.etm.ejbtest;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class MainEJB {
@EJB
private DummyParent dummyParent;
public MainEJB() {
}
@PostConstruct
protected void init() {
System.out.println("init of MainEJB");
dummyParent.sayHi();
}
}
Я бегу это на JBoss 7, но я получаю сообщение об ошибке говорящее
Нет EJB найден с интерфейсом тип 'com.etm.ejbtest.DummyParent' для привязки com.etm.ejbtest.MainEJB/dummyParent
Любая идея, почему это не сработает?
Да, вы правы, когда я изменить его на «@Inject» вместо «@EJB» он работает. –
В качестве альтернативы вы можете использовать '@EJB (beanInterface = ReferencedEJB.class)' или '@EJB (beanName =" ReferencedEJB ")', поэтому контейнер EJB знает, какой EJB вы хотите. Начиная с EE 6/EJB 3.1, вы также можете использовать 'EJB (lookup =" ... ")', чтобы указать java: global, java: app или java: имя модуля JNDI целевого EJB. –