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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

@Inject MyEJB service

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

Ответ 3

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

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

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

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

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

Ответ 4

Интересно, могу ли я вводить EJB в неуправляемые объекты. Более подробную информацию см. В документации Weld (справочная реализация JSR 299).

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

@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;
  }

}

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