Search code examples
jakarta-eevaadincdivaadin7

I cannot instantiate my bean using @Inject and Vaadin CDI


I am trying to inject my components and beans using Vaadin-cdi. Note the code below is simplified a bit.

@Theme("valo")
@CDIUI("")
public class MyUI extends UI {

    @Inject
    private CDIViewProvider provider;

    @Override
    protected void init(VaadinRequest request) {
        Navigator navigator = new Navigator();
        navigator.addProvider(provider);
        navigator.navigateTo("mypanel");  
    }   
}

And here goes MyPanel:

@CDIView("mypanel")
public class MyPanel extends com.vaadin.ui.Panel implements View {
    @Inject
    private MySubPanel mySubPanel;    

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
        FormLayout layout = new FormLayout();
        layout.addComponent(mySubPanel);
        this.setContent(layout);
    }
}

And here is the MySubPanel class:

@UIScoped
public class MySubPanel extends Panel {

    @Inject
    private MyBean myBean;
    public MySubPanel() {
        myBean.createSomething("Something");  // throws NullPointerException
    }
}

And finally the MyBean class:

@Stateless
@Default
public class MyBean implements Serializable {
    private String something;
    public void createSomething(String something) {
        this.something = something;
    }
}

So why does not my bean in MySubPanel beeing injected?

I have an empty beans.xml and I am using WildFly 8.1.


Solution

  • In the constructor class variables are not yet injected. The bean will be injected after initialising, so it is null in the constructor. You have 2 possibilities.

    • Inject the bean in the Constructor.
    • Use the bean in an init method annotated with @PostConstruct

    I'd recommend the second approach. Here you will find more about the different injection methods: http://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html