注射问题(使用vaadin)

时间:2015-01-30 19:00:19

标签: java dependency-injection ejb vaadin7

我是EJB和注射的新手......

我目前正在使用带有CDI的Vaadin框架

我一直在尝试使用注射但我无法做到......

在我的Vaadin UI类MyVaadinUI中我试过......

CDIUI("")
@SuppressWarnings("serial")
public class MyVaadinUI extends UI {


@EJB
UserController userController;

@Override
protected void init(VaadinRequest request) {

  System.err.println("desde controller "+userController.getAll().size());

}

}

UserController中

@Stateless
public class UserController {

    @EJB
    IUserDAO userDao;

   public List<User> getAll() {

        return userDao.findAll();
    }


}

它有效!!

但是当我不注入UserController时,它不起作用......换句话说,当我实例化UserController类时,这个类中的注入不起作用......

代码不起作用

     CDIUI("")
    @SuppressWarnings("serial")
    public class MyVaadinUI extends UI {


    @Override
    protected void init(VaadinRequest request) {
           UserController userController = new UserController();
      System.err.println("desde controller "+userController.getAll().size());

    }

}

有人可以解释我为什么?

由于

尼古拉斯

1 个答案:

答案 0 :(得分:2)

仅在注入的对象中才会注入其依赖项。如果您使用new创建一个包含@inject字段的对象,则不会注入@ejb@resource。 在您的情况下,您可以像这样创建UserController:

UserController userController = new UserController();

因此不会注入此字段:

@EJB
IUserDAO userDao;

因此getAll()将抛出NullPointerException。

我使用vaadin和cdi进行项目。我建议几乎所有东西都使用注射剂,或者根本不使用。我注入了我的uis,视图,自己的组件......(并且不要用new创建它们)所以可以将ejb bean或其他东西注入其中。如果您正在使用它,有时您最终会混合注入和正常对象创建,并且必须将注入的对象传递给您自己实例化的其他对象。在我的另一个项目中,这种情况发生了,并且在代码中未来发生变化时确实存在问题。