@Inject字段始终为null

6

我尝试像这样@Inject一个字段(它是一个jar模块,在META-INF下存在空的beans.xml):

IDataProvider接口

public interface IDataProvider {
  void test();
}

DataProvider实现 导入javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class DataProvider implements IDataProvider {
  private int i;

  public DataProvider() {
    i = 42;
  }

  @Override
  public void test() {

  }
}

我尝试注入 DataProvider 的类

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class DataController {

  @Inject
  private IDataProvider dataProvider;

  private int k;

  public DataController() {
     k = 42;
  }
}

如果我在Wildfly上运行此代码,注入的dataProvider始终为null(在DataController构造函数处断点)。

每个教程都是这样做的,所以我认为这应该可以工作。唯一的区别是两个类都应该是@ApplicationScoped。

我正在使用Wildfly 8.2Final、Gradle、IntelliJ。 我的gradle.build文件如下:

apply plugin: 'java'

repositories {
  mavenCentral()
  jcenter()
}

dependencies {
  compile group:'javax', name:'javaee-web-api', version:'7.+'
  compile group:'org.jboss.ejb3', name:'jboss-ejb3-ext-api', version:'2.+'
}

sourceSets {
  main {
      java {
          srcDir 'src/api/java'
          srcDir 'src/main/java'
      }
  }

  test {
      java {
          srcDir 'src/test/java'
      }
  }
}

jar {
  from ('./src') {
      include 'META-INF/beans.xml'
  }
}

有没有人知道为什么这不起作用?我从 Wildfly 中没有收到任何错误或异常信息。


1
据我所知,字段注入是在构造函数调用之后执行的。您可以通过添加一个带有@PostConstruct注释的方法并进行调试来验证这一点。 - Christoph Giesche
CDI如何在对象构造之前注入对象的字段?注入将在构造函数调用之后发生。 - JB Nizet
有人将此标记为重复......但是原始内容在哪里? - Alkanshel
1个回答

12
在构建DataController时,dataProvider为null是正常的。注入发生在此之后。 您应该添加一个@PostConstruct方法来检查该字段是否为null:
@PostConstruct
void init() {
    // dataProvider should not be null here.
}

此外,Weld 的错误报告做得相当好。因此,如果注入失败,您应该会收到明确且详细的错误消息,而不仅仅是一个空字段。

谢谢,非常有效。我不知道它不是通过构造函数注入的。 - Ben1980
谢谢你的回答。它对我也有帮助。最简单和最明显的事情... - hrs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接