这是一个由Java EE应用程序在运行时生成/加载的类(@Default Bar
bean由同一个应用程序提供):
public class Foo {
@PersistenceContext private EntityManager em;
@Resource private UserTransaction tx;
@EJB private MyEJB ejb;
@Inject Bar bar;
public Foo() {
}
@PostConstruct
public void postConstruct () { ... }
public void businessMethod() { ... }
}
以下是它的实例化方式:
import javax.enterprise.inject.spi.Unmanaged;
...
@Inject private BeanManager bm;
...
Class clazz = loadClazz();
Unmanaged unmanaged = new Unmanaged(bm, clazz);
Object obj = unmanaged.newInstance()
.produce()
.inject()
.postConstruct()
.get();
使用JBoss / WildFly,所有字段都被正确注入,包括EntityManager,EJB,UserTransaction等。
使用TomEE和GlassFish,将忽略Java EE资源,只会注入bar
字段。
总体目标是提供全方位的CDI注入(简单@Inject
以及Java EE资源,如@PersistenceContext
,@Resource
,@EJB
等。动态代码。我的第一次尝试是生成一个即时的类,它将包含带注释的字段+动态业务逻辑(是的,它可以工作,但仅限于WildFly)。一般来说,我有一组动态注入定义,如下所示:
@Annotation(param = "value") @Qualifier1 @Qualifier2 ... Type name;
其中Annotation
是Inject
,PersistenceContext
,Resource
,EJB
等之一,我希望获得一个已经注入的实例如果这是在CDI托管bean中。因此,假设采用注入元数据并返回相应实例的假设方法是可接受的。
答案 0 :(得分:0)
您是否尝试过declaring resources via producer fields?
这样做,您可@Inject
EntityManager
,UserTransaction
等,而无需借助CDI之前的注释。
由于通过@Inject
注入CDI似乎适用于所有环境,因此这可能是一个可行的解决方案。