【问题标题】:Vaadin: CDI Inject is null after referencingVaadin:CDI Inject 在引用后为空
【发布时间】:2012-09-23 11:59:47
【问题描述】:

美好的一天。

有一个应用程序(使用 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() 不为空,但是当我在登录窗口中调用application.authenticate() 方法时,lang.get() 始终为空。似乎在使用引用时,Instance.get() 方法无法获取类的实例。

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

【问题讨论】:

  • 对 CDI 无能为力,但很乐意为 Spring 提供帮助。
  • 谢谢你,奥列格。我也喜欢 Spring,但必须将 Vaadin 与 CDI 一起使用。似乎是初始化/注入顺序的问题

标签: jakarta-ee jboss7.x vaadin cdi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多