2010-01-07 5 views
13

Будучи полным турбо сегодня днем ​​и не может найти ответ нигде.EJB 3.1 @EJB Инъекция в POJO

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

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

Заранее спасибо.

Karl

+0

Вы используете CDI? http://java.sun.com/javaee/6/docs/tutorial/doc/giwhb.html –

ответ

19

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

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

+0

Не все реализации Java EE 5 позволяют публиковать @Local bean-компонент в дереве JNDI. Насколько я помню, это дополнительная функция в спецификации. В WebLogic 11g этого не происходит, поэтому в этом случае мы передаем внедренный ресурс в качестве аргумента конструктора POJO. – BonanzaOne

7

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

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

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

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

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

+1

Выполнение поиска из любого места уже было возможно с предыдущими версиями Java EE (даже J2EE). EJB 3.1 не меняет этого. Что нового в Java EE 6 состоит в том, что вы можете сделать что-нибудь управляемым компонентом с использованием CDI, а также извлечь выгоду из инъекции в CDI-компонентах. –

+1

Предыдущие версии Java EE не указали глобальный синтаксис именования JNDI. Они также не требовали, чтобы удаленный клиент, не являющийся клиентом приложения, мог искать что-либо в JNDI. –

1

Интересно, если бы я мог inject EJBs into unmanaged objects. Дополнительную информацию см. В документации по документации Weld (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; 
    } 

} 

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

28

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

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

@Inject MyEJB service 

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

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