EJB 3.1 @EJB Инъекция в POJO - PullRequest
       48

EJB 3.1 @EJB Инъекция в POJO

13 голосов
/ 07 января 2010

Будучи полным тюрбом сегодня днем ​​и, похоже, нигде не найду ответа.

С новой спецификацией EJB 3.1 возможно ли вставить EJB в pojo? Я знаю, что в EJB 3.0 аннотацию @EJB можно использовать для внедрения EJB, но это не работает для простых pojos.

Если это не так, мне нужно искать компонент в JNDI, поскольку я знаю, что вы не можете просто использовать новое ключевое слово.

Спасибо заранее.

Karl

Ответы [ 4 ]

28 голосов
/ 14 августа 2010

С новой спецификацией EJB 3.1 возможно ли ввести EJB в pojo? Я знаю, что в EJB 3.0 аннотацию @EJB можно использовать для внедрения EJB, но это не работает для простых pojos.

Возможно внедрение EJB в POJO ЕСЛИ вы используете JSR-299 (Java C ontexts и D ependency I njection ) т.е. если ваш POJO является управляемым компонентом CDI. В этом случае вы можете сделать:

@Inject MyEJB service

Но это не функция EJB 3.1, это исходит от CDI. И если вы не используете CDI, вам придется искать.

19 голосов
/ 07 января 2010

Да, используйте поиск JNDI.

Поскольку ваш POJO создан вами (я полагаю), контейнер не отвечает за внедрение зависимостей.

7 голосов
/ 07 января 2010

Новая спецификация EJB (3.1) добавляет возможность указывать глобальные имена JNDI для EJB. Это означает, что вы можете использовать их в любом бине, где угодно.

Однако вы должны выполнить явный поиск JNDI, поскольку контейнер EJB 3.1 не будет знать о вашем POJO.

Единственное исключение, которое, я предполагаю, к вам не относится, - это если ваш POJO действительно является клиентом приложения, и в этом случае, если поле, которое должно содержать EJB, является статическим, вы можете применить аннотацию @EJB к этому. Если это ваша ситуация, вы должны проверить правила клиента приложения в общей спецификации Java EE 5.

Наконец, Java EE 6 с включением JSR-299 может позволить тому, что вы описываете, каким-то образом произойти; Я еще не знаю спецификацию, поэтому не могу комментировать.

Надеюсь, это все поможет.

1 голос
/ 08 января 2010

Интересно, смогу ли я внедрить EJB в неуправляемые объекты . Подробнее см. Документацию Сварка (эталонная реализация JSR 299).

Но вы можете выполнить внедрение зависимостей вручную внутри хранилища или фабрики следующим образом:

@Stateless
public PojoRespository {

  @Inject
  ResourceForPojos resource;
  @PersistenceContext
  private EntityManager em;

  public Pojo findById(Object id) {
    Pojo p = (Pojo) em.find(Pojo.class, id);
    p.setResource(resource); // injects resource
    return p;
  }

}

Если у вас есть много методов, где инъекция должна быть выполнена, вы можете использовать перехватчик.

...