Vaadin:引用后CDI Inject为null

时间:2012-09-23 11:59:47

标签: java-ee jboss7.x vaadin cdi

美好的一天。

有一个应用程序(使用CDI添加):

@VaadinScoped(VaadinScope.APPLICATION)
public class AdminApplication extends AbstractCdiApplication {

   @Inject
   private Instance<Lang> lang;

   @Override
   public void init() {
    setMainWindow(new LoginWindow(this));
   }

   public void authenticate(String login, String password) throws Exception {
    lang.get(). ...
}
     ...

和LoginWindow:

public class LoginWindow extends Window {
     ...
     public LoginWindow(AdminApplication application) {
       super("LoginWindow Login");
       this.application = application;
       initUI();
       initLoginListener();
     }
      private void initLoginListener() {
         btnLogin.addListener(new Button.ClickListener() {
            public void buttonClick(Button.ClickEvent event) {
               try {
                   String username = (String) txtUsername.getValue();
                   String password = (String) txtPassword.getValue();

                   application.authenticate(username, password);
               } catch (Exception e) {
                showNotification(e.toString());
               }
           }
    });
}

问题是当应用程序的初始化阶段lang.get()不为空时,但是当我在LoginWindow中调用application.authenticate()方法时,lang.get()始终为null 。似乎在使用引用时,Instance.get()方法无法获得该类&#39;实例

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

在您的应用程序中,您可以通过“new”创建LoginWindow。这样,它不受CDI容器管理。您必须将窗口注入应用程序,然后在init()方法中设置它。

答案 1 :(得分:1)

我在Wildfly 8.1和8.2中遇到了这个问题,但是当我在WEB-INF中添加了一个空的beans.xml时就可以了。因此,如果上述方法不起作用,请尝试。