EJB 3.1 - Использование @EJB внутри EJB - возможно ли это? - PullRequest
4 голосов
/ 24 ноября 2010

Можно ли использовать @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 является нулевым (не инициализируется @EJB).

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

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

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

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

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

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

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

1 голос
/ 24 ноября 2010

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

0 голосов
/ 07 декабря 2014

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

...