EJB 3.1. Возможно ли использование @EJB внутри EJB?

Можно ли использовать @EJB внутри другого EJB? Я пытаюсь сделать это сейчас, и мой EJB заканчивается нулевым значением. Опишу свою проблему на примере.

@Stateless
@LocalBean
@Local(LoginServiceLocal.class)
public class LoginService implements LoginServiceLocal {    

    public void createLogin(String email, String password) { ... }
}

@Stateless
@LocalBean
@Local(AccountServiceLocal.class)
public class AccountService implements AccountServiceLocal {

    @PersistenceContext(unitName = "accounts")
    private EntityManager accountEntityManager;

    @EJB
    private LoginServiceLocal loginService;

    public void createAccount(Account account, String email, String password) {
        accountEntityManager.persist(account);
        loginService.createLogin(email, password);
    }
}

Предполагается ли, что такие вещи возможны? Я также должен упомянуть, что я использую встроенный контейнер (через EJBContainer) и ищу AccountService с помощью JNDI, однако, когда я пытаюсь вызвать loginService.createLogin в AccountService, loginService имеет значение null (не инициализируется @EJB).

Возможно ли то, что я пытаюсь сделать?

Спасибо.


person Brian DiCasa    schedule 24.11.2010    source источник
comment
Этот код определенно соответствует требованиям. Возможно, у вас возникла какая-то несвязанная проблема с развертыванием, поэтому убедитесь, что LoginService успешно развернут. Если вы хотите увидеть рабочий пример EJB, ссылающегося на EJB через @EJB, посмотрите openejb.apache.org/3.0/injection-of-other-ejbs-example.html   -  person David Blevins    schedule 27.11.2010


Ответы (3)


Да, это возможно.

Аннотация @LocalBean позволяет EJB отображать клиентское представление без интерфейса, поэтому вам не нужно определять локальный интерфейс.

С другой стороны, аннотация @Local определяет локальный клиентский интерфейс компонента.

Выберите один из указанных выше параметров конфигурации, а не оба.

Если вы решите использовать аннотацию @LocalBean, отбросьте аннотацию @Local, удалите ключевое слово Implements и введите имя класса компонента с аннотацией @EJB.

Если вы решите использовать аннотацию @Local, отбросьте аннотации @Local и @LocalBean и внедрите в компонент аннотацию @EJB, используя имя интерфейса.

person dimsap    schedule 25.11.2010
comment
Просто отметим, что использование обоих должно быть в порядке. Если это на что-то влияет, то это точно баг. - person David Blevins; 27.11.2010

Да, я просто работал над частью своего кода, который делает именно это. Проблема может заключаться в том, как вы создаете EJB. Я сделал это только с помощью инъекции, а не поиска jndi.

person JOTN    schedule 24.11.2010

Если вы используете EJB3.1, вы также можете использовать @Inject из CDI.

person Armen Arzumanyan    schedule 07.12.2014