构造函数中的CDI注入



我的应用程序设置为使用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将解析的注入点。这当然不是想要的方法,但如果它对你有用,那就去做吧

最新更新