Интегрировать в приложение CDI, чтобы контейнер его не поддерживал?
Мое приложение развернуто на JOnAS 5.2.2
это не поддерживает CDI
за EJB
, Мне нужно использовать CDI
на что EJB
, Я умею пользоваться CDI
на WAR части приложения, но я не знаю, в EJB
часть.
Есть ли способ добавить поддержку CDI
за EJB
приложение в контейнере, которое не поддерживает его?
Мой босс не будет обновлять сервер до версии, которая его поддерживает.
[РЕДАКТИРОВАТЬ] Я использую CDI-WELD: я нашел начало решения:
//CDI uses an AnnotatedType object to read the annotations of a class
AnnotatedType<DAOTest> type = beanManager.createAnnotatedType(DAOTest.class);
//The extension uses an InjectionTarget to delegate instantiation, dependency injection
//and lifecycle callbacks to the CDI container
InjectionTarget<DAOTest> it = beanManager.createInjectionTarget(type);
//each instance needs its own CDI CreationalContext
CreationalContext ctx = beanManager.createCreationalContext(null);
//instantiate the framework component and inject its dependencies
test = it.produce(ctx); //call the constructor
System.out.println("instance" + test);
it.inject(test, ctx); //call initializer methods and perform field injection
it.postConstruct(test); //call the @PostConstruct method
test.test();
it.preDestroy(test); //call the @PreDestroy method
it.dispose(test); //it is now safe to discard the instance
ctx.release(); //clean up dependent objects
У меня есть тест с инъекцией другого в DAOTest, как это:
@Named
@Dependent
public class DAOTest implements Serializable {
private static final long serialVersionUID = 1L;
@Persitence(value = "CDI-ejb")
private EntityManager em;
@Inject
private User user;
public void test(){
System.out.println(user.getName());
em.getClass();
}
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
public DAOTest() {
// TODO Auto-generated constructor stub
}
}
Это работает, но EntityManager не разрешен с помощью @PersistenceContext. Я думаю, что я должен использовать аннотацию @Produce, но я не понимаю, как это сделать.
1 ответ
Вам нужно будет использовать Deltaspike с функциональностью BeanProvider.