【发布时间】:2012-02-28 13:32:03
【问题描述】:
我已将应用程序设置为使用 CDI,一切顺利。现在我正在创建一个新的 bean,它从 3rd 方库中扩展了一个类。我试图创建类似以下示例的内容:
@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,它在 Tomcat 6 上运行。
【问题讨论】:
-
doStuff() 方法是不是被构造函数调用了?如果是这样,那么 @PostConstruct 注释对你没有任何好处。
-
构造函数和 PostConstruct 方法纯粹是为了在调用 doStuff() 时进行测试。我不想拥有任何一个,并且希望我的代码尽可能接近原始代码示例。
标签: seam cdi jboss-weld