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

时间:2015-06-23 06:55:15

标签: java-ee vaadin cdi vaadin7

我正在尝试使用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");  
    }   
}

这里是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类:

@UIScoped
public class MySubPanel extends Panel {

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

最后是MyBean类:

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

1 个答案:

答案 0 :(得分:1)

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

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

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