我无法使用 @Inject 和 Vaadin CDI 实例化我的 bean

I cannot instantiate my bean using @Inject and Vaadin CDI

我正在尝试使用 Vaadin-cdi 注入我的组件和 bean。注意下面的代码被简化了一点。

@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");  
    }   
}

这里是我的面板:

@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);
    }
}

这是 MySubPanel class:

@UIScoped
public class MySubPanel extends Panel {

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

最后是 MyBean class:

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

那么为什么我的 MySubPanel 中的 bean 没有被注入?

我有一个空 beans.xml,我正在使用 WildFly 8.1。

在构造函数中 class 变量尚未注入。该bean 将在初始化后注入,因此在构造函数中为null。你有2种可能。

  • 在构造函数中注入bean。
  • 在用 @PostConstruct 注释的 init 方法中使用 bean

我推荐第二种方法。在这里您可以找到更多关于不同注入方法的信息:http://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html