我的应用程序设置使用CDI,并且一切顺利。现在我正在创建一个从第三方库扩展类的新bean。我试图创建类似下面的示例:构造函数中的CDI注入
@Named("myNewClass")
@ConversationScoped
public class MyNewClass extends ThirdPartyClass {
@Inject
private ApplicationConfig applicationConfig;
@Override
public void doStuff() {
// In this code, applicationConfig will be null.
}
}
当调用doStuff时,applicationConfig始终为null。我添加了一个没有参数的构造函数&用@PostConstruct标记的方法来试着看看发生了什么。构造函数被调用,然后是doStuff方法。由于doStuff在构建时被调用,所以此时不能使用@Inject注释。
所以我的问题是如何获得applicationConfig在这一点?
我一直在摆弄BeanManager(这是一个功能我ApplicationConfig.class称作为参数):
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
BeanManager beanManager = (BeanManager) envCtx.lookup("BeanManager");
Bean myBean = beanManager.getBeans(clazz).iterator().next();
return beanManager.getReference(myBean, clazz, beanManager.createCreationalContext(myBean));
其中一期工程,但它创建一个新的ApplicationConfig实例。我想获得我认识的已存在于ConversationScope上的那个。
提供一些信息:我使用Seam 3.0,虚焊的Servlet 1.1.1,这是在Tomcat 6,运行
是由构造函数调用的doStuff()方法吗?如果是这样,那么@PostConstruct注释对你没有任何好处。 – 2012-02-28 16:03:50
构造函数&PostConstruct方法纯粹用于在调用doStuff()时进行测试。我不想让我的代码尽可能接近原始代码示例。 – 2012-02-29 14:02:29