@Inject 字段始终为空

@Inject field is always null

我尝试 @Inject 一个字段(它是一个 jar 模块,空 beans.xml 存在于 META-INF 下),如下所示:

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 的 class

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 构造函数处的断点)。

每个教程都是这样完成的,所以我认为这应该可行。唯一的区别是两个 classes 都应该是 @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 收到任何错误或异常。

在构造DataController时,dataProvider为null是正常的。注射发生在那之后。

您应该添加一个 @PostConstruct 方法来检查字段是否为空:

@PostConstruct
void init() {
    // dataProvider should not be null here.
}

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