2012-09-23 41 views
0

美好的一天。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(). ... 
} 
    ... 

而且登录窗口:

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()始终为空。看起来在使用引用时,Instance.get()方法无法获得类的实例。

有谁知道为什么会发生这种情况?

+0

不能帮助CDI,但很乐意帮助Spring。 – OlegYch

+0

谢谢OlegYch。我也喜欢Spring,但是要求在CDI中使用Vaadin。这似乎与初始化/注入顺序的问题 – Dmitry

回答

1

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

1

我在Wildfly 8.1和8.2中遇到了这个问题,但是当我在WEB-INF中添加了一个空的beans.xml时,它工作正常。所以如果上述不起作用的话。