@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 的错误报告做得很好。因此,如果注入失败,您应该有一个明确而详细的错误消息,而不仅仅是一个空字段。
我尝试 @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 的错误报告做得很好。因此,如果注入失败,您应该有一个明确而详细的错误消息,而不仅仅是一个空字段。