Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@Inject field is always null [duplicate]

Tags:

java

cdi

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.

like image 996
Ben1980 Avatar asked May 13 '15 11:05

Ben1980


People also ask

What will @inject do?

@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.

What is @inject in constructor?

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.


Video Answer


1 Answers

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.

like image 118
Benjamin Avatar answered Sep 19 '22 00:09

Benjamin