2010-11-24 2 views
4

Можно ли использовать @EJB внутри другого EJB? Я пытаюсь сделать это сейчас, и мой EJB заканчивается нулевым. В примере я расскажу о своей проблеме.EJB 3.1 - Использование @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).

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

Спасибо.

+0

Этот код, безусловно, соответствует. Возможно, у вас возникла какая-то проблема несвязанного развертывания, поэтому убедитесь, что LoginService успешно развернут. Если вы хотите увидеть рабочий пример EJB, ссылающийся на EJB через @EJB, посмотрите http://openejb.apache.org/3.0/injection-of-other-ejbs-example.html – 2010-11-27 19:45:10

ответ

2

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

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

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

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

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

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

+1

Просто обратите внимание, что использование обоих должно быть прекрасным. Если это влияет на что-либо, то это определенно ошибка. – 2010-11-27 19:49:22

1

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

0

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

Смежные вопросы