我的应用程序设置为使用CDI,一切都很顺利。现在我正在创建一个新的bean,它扩展了第三方库中的一个类。我试图创建如下示例:
@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,Weld Servlet 1.1.1,它在Tomcat6上运行。
您可以用@Inject注释构造函数,然后构造函数的任何参数都将成为BeanManager将解析的注入点。这当然不是想要的方法,但如果它对你有用,那就去做吧