2013-07-10 6 views
1

Я изучаю как 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

Любая идея, почему это не сработает?

ответ

2

Не путайте CDI и аннотацию @EJB; впрыск @EJB управляется контейнером EJB , а не CDI; он будет вводить EJB, а DummyParent - не EJB.

Это звучит контр-интуитивно для кого-то нового на сцене. EJB прошли задолго до официальной поддержки Java EE для CDI.

Поиск Google для инъекций EJB через CDI может пролить свет на это для вас.

+0

Да, вы правы, когда я изменить его на «@Inject» вместо «@EJB» он работает. –

+0

В качестве альтернативы вы можете использовать '@EJB (beanInterface = ReferencedEJB.class)' или '@EJB (beanName =" ReferencedEJB ")', поэтому контейнер EJB знает, какой EJB вы хотите. Начиная с EE 6/EJB 3.1, вы также можете использовать 'EJB (lookup =" ... ")', чтобы указать java: global, java: app или java: имя модуля JNDI целевого EJB. –

1

Вы сможете вводить свою EJB таким образом, если вы используете следующий параметр подстановки:

@EJB(lookup="{moduleName}/ReferencedEJB") 
private DummyParent parent;