2012-02-28 142 views
1

我的应用程序设置使用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,运行

+2

是由构造函数调用的doStuff()方法吗?如果是这样,那么@PostConstruct注释对你没有任何好处。 – 2012-02-28 16:03:50

+0

构造函数&PostConstruct方法纯粹用于在调用doStuff()时进行测试。我不想让我的代码尽可能接近原始代码示例。 – 2012-02-29 14:02:29

回答

1

您可以用标注一@注入构造,则构造成为注射点的任何参数, BeanManager将解析。这当然不是所希望的方式,但如果它适合你,就去做吧。