I try to @Inject a field (its a jar module, empty beans.xml is existing under META-INF) like this:
IDataProvider Interface
public interface IDataProvider {
void test();
}
DataProvider implementation import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class DataProvider implements IDataProvider {
private int i;
public DataProvider() {
i = 42;
}
@Override
public void test() {
}
}
And the class where i try to inject the 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;
}
}
If i run this on Wildfly the injected dataProvider is always null (Breakpoint at DataController constructor).
On every tutorial it's done like this, so i thought this should work. Only difference is that both classes should be @ApplicationScoped
I am using Wildfly 8.2Final, Gradle, IntelliJ. My gradle.build looks like this:
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'
}
}
Does anyone have an idea why this is not working? i dont get any error or exception from Wildfly.
@Inject can apply to at most one constructor per class. @Inject is optional for public, no-argument constructors when no other constructors are present. This enables injectors to invoke default constructors.
Constructor Injection is the most common form of Dependency Injection. Constructor Injection is the act of statically defining the list of required dependencies by specifying them as parameters to the class's constructor.
During the construction of the DataController
, it's normal the dataProvider
is null. Injection happens after that.
You should add a @PostConstruct
method to check for nullity of the field:
@PostConstruct
void init() {
// dataProvider should not be null here.
}
Aditionally, error reporting on Weld is pretty well done. So you should have an explicit and detailed error message if the injection fails, and not only a null field.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With