【问题标题】:I cannot instantiate my bean using @Inject and Vaadin CDI我无法使用 @Inject 和 Vaadin CDI 实例化我的 bean
【发布时间】:2015-09-08 20:10:54
【问题描述】:

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

那么为什么我在MySubPanelbeeing 中的bean 没有注入呢?

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

【问题讨论】:

  • 你厌倦了@EJB 而不是@Inject?

标签: jakarta-ee vaadin cdi vaadin7


【解决方案1】:

在构造函数中,类变量尚未注入。 bean会在初始化后被注入,所以在构造函数中为null。你有两种可能。

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

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

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 2011-05-07
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多