【问题标题】:CDI Injection Within A Constructor构造函数中的 CDI 注入
【发布时间】: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


【解决方案1】:

您可以使用 @Inject 注释构造函数,然后构造函数的任何参数都将成为 BeanManager 将解析的注入点。这当然不是你想要的方式,但如果它适合你,那就去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2013-10-23
    相关资源
    最近更新 更多