Возможно ли вручную вставить компонент в контекст CDI? С каркасом JBoss Seam я всегда мог делать что-то вроде Contexts.getConversationContext().set("foo", bar);
, и Bean станет частью этого контекста. Возможно ли сделать что-то подобное в Java EE 6 CDI?Инъекционный компонент в CDI Context программно?
ответ
Невозможно сделать это в агностическом способе реализации. Вам нужно будет вникать в реализацию, найти объекты области, вытащить их через BeanManager и выяснить, как их добавить. Не все из них (возможно, ни один из них) так же легко установить, как карты.
Нельзя ли использовать методы Продюсера?
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
Или вы после того, как что-то конкретное в рамках разговора?
С CDI вы должны слегка изменить способ, которым вы думаете о бобах. В Seam2 контексты - это просто карты, которые хранятся в определенной области, и у вас есть доступ к этим картам. В CDI контейнер получает контроль над контекстами и позволяет вам только объявлять beans в конкретной области, и все управляется за сценой без доступа к картам областей. Это делается потому, что философия CDI заключается в том, чтобы сохранять вещи безопасными по типу и просто устанавливать вещи на карте со строкой в качестве значения, а их ввод их строковым ключом вообще не безопасен для типов.
Для достижения цели вы хотите создать «держатель» в конкретном объеме и сохранить свои ценности там.
@Named
@ConversationScoped
public class UserManager {
private User currentUser;
//getters and setters for currentUser
}
В этом примере экземпляр пользователя хранится в области разговора, установив его в компоненте, связанным с цепочкой. Это полностью безопасно для типов, так как вы можете вводить UserManager в любом месте, просто используя @Inject (на самом деле используется его тип), избегая строковых ключей (как в Seam2), которые небезопасны при выполнении рефакторинга.
- 1. Инъекционный компонент в другой компонент
- 2. Инъекционный список объектов в CDI (Weld)
- 3. CDI инъекционный Bean, который имеет параметризованный конструктор
- 4. CDI: @Produces метод не инъекционный после вызова экземпляра с AnnotationLiteral
- 5. DeltaSpike CDI Testing + NPE Faces Context
- 6. Инъекционный компонент, объявленный в XML-файле, с помощью аннотации @Inject
- 7. Чтение context-param в CDI bean возвращает null
- 8. Добавить Бин программно в Spring Web App Context
- 9. Как CDI удаляет сессионный компонент с состоянием?
- 10. Java Batch (JSR-352) и Session Context CDI
- 11. CDI не может получить ответ сервлета с помощью аннотации @Context
- 12. Angular2 программно удаляет компонент.
- 13. Как настроить компонент non-CDI от стороннего участника для @Inject в CDI bean
- 14. Инъекционный компонент динамически? Или @Autowire bean не создан Spring
- 15. grunt-injector: Инъекционный компонент загрузочного бустера к index.html
- 16. SEAM localeSelector не инъекционный
- 17. React.js: Confuse about context this this context context
- 18. Инъекционный тип
- 19. Ввод новых объектов в цикл с CDI (Weld)
- 20. Инъекционный контроллер в приложение?
- 21. Инъекционный сеанс в модель
- 22. Правильный способ ввода CDI Контекстные компоненты в существующий неконтекстный компонент?
- 23. Java EE впрыснуть CDI @SessionScoped в EJB @Stateless сессионный компонент
- 24. Inject CDI управляемый bean-компонент в пользовательском Shiro AuthorizingRealm
- 25. Невозможно вставить компонент CDI в Primefaces Класс реализации LazyDataModel
- 26. Vue js создает компонент программно
- 27. Имитировать CDI-компоненты динамически или вводить в не-cdi-beans
- 28. Как уничтожить «сам» компонент программно в угловом2?
- 29. Компонент моделирования программно в Codename One?
- 30. Применить фильтры программно в Vue.js Компонент
В идеале, я хотел бы иметь возможность вводить в любой объем, который мне нужен. В настоящее время мне нужно внедрить в область запроса, но я вижу примеры использования, в которых нам также нужно вводить в сеансы разговора или сеанса. – Shadowman
Ну, я определил Продюсера, который затем я использую с помощью аннотации \ @Inject. Конкретным примером является приложение Faces. Я определил класс FacesContextProducer, который позволяет ManagedBeans вводить текущий FacesContext (поэтому мне не нужно повторять весь шаблонный код, чтобы получить доступ к FacesContext с помощью статического метода getInstance()). Я могу использовать это независимо от того, в какой области работает компонент, использующий аннотацию \ @Inject. Я обнаружил, что довольно гибкий и очистил много повторяющегося кода в моем приложении. – EdH
Плюс, если вы не определяете область действия, она неявно будет 'Dependent' и наследует область применения вставляемого компонента. –