2012-09-23 43 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時,它工作正常。所以如果上述不起作用的話。