2014-02-03 5 views
5

Возможно ли вручную вставить компонент в контекст CDI? С каркасом JBoss Seam я всегда мог делать что-то вроде Contexts.getConversationContext().set("foo", bar);, и Bean станет частью этого контекста. Возможно ли сделать что-то подобное в Java EE 6 CDI?Инъекционный компонент в CDI Context программно?

ответ

-2

Невозможно сделать это в агностическом способе реализации. Вам нужно будет вникать в реализацию, найти объекты области, вытащить их через BeanManager и выяснить, как их добавить. Не все из них (возможно, ни один из них) так же легко установить, как карты.

3

Нельзя ли использовать методы Продюсера?

http://docs.jboss.org/weld/reference/1.0.0/en-US/html/producermethods.html

Я сделал это, чтобы создать объекты, которые получают инъекционные в мои бобы.

В то время как я не использовал это, есть также интерфейс BeanManager

http://docs.jboss.org/weld/reference/1.0.0/en-US/html/extend.html

Или вы после того, как что-то конкретное в рамках разговора?

+0

В идеале, я хотел бы иметь возможность вводить в любой объем, который мне нужен. В настоящее время мне нужно внедрить в область запроса, но я вижу примеры использования, в которых нам также нужно вводить в сеансы разговора или сеанса. – Shadowman

+1

Ну, я определил Продюсера, который затем я использую с помощью аннотации \ @Inject. Конкретным примером является приложение Faces. Я определил класс FacesContextProducer, который позволяет ManagedBeans вводить текущий FacesContext (поэтому мне не нужно повторять весь шаблонный код, чтобы получить доступ к FacesContext с помощью статического метода getInstance()). Я могу использовать это независимо от того, в какой области работает компонент, использующий аннотацию \ @Inject. Я обнаружил, что довольно гибкий и очистил много повторяющегося кода в моем приложении. – EdH

+2

Плюс, если вы не определяете область действия, она неявно будет 'Dependent' и наследует область применения вставляемого компонента. –

3

С CDI вы должны слегка изменить способ, которым вы думаете о бобах. В Seam2 контексты - это просто карты, которые хранятся в определенной области, и у вас есть доступ к этим картам. В CDI контейнер получает контроль над контекстами и позволяет вам только объявлять beans в конкретной области, и все управляется за сценой без доступа к картам областей. Это делается потому, что философия CDI заключается в том, чтобы сохранять вещи безопасными по типу и просто устанавливать вещи на карте со строкой в ​​качестве значения, а их ввод их строковым ключом вообще не безопасен для типов.

Для достижения цели вы хотите создать «держатель» в конкретном объеме и сохранить свои ценности там.

@Named 
@ConversationScoped 
public class UserManager { 

    private User currentUser; 

    //getters and setters for currentUser 

} 

В этом примере экземпляр пользователя хранится в области разговора, установив его в компоненте, связанным с цепочкой. Это полностью безопасно для типов, так как вы можете вводить UserManager в любом месте, просто используя @Inject (на самом деле используется его тип), избегая строковых ключей (как в Seam2), которые небезопасны при выполнении рефакторинга.

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