@EJB和@Inject对我的vaadin类不起作用

时间:2015-04-03 08:56:59

标签: java ejb vaadin7 inject

我尝试将我的singleton启动bean注入一个vaadin类,该bean初始化CustomerDataModel。

@Startup
@Singleton
public class StartupBean {
   @Resource(lookup = "java:global/customerDatabase")
   private String customerDatabasePath;

   @Resource(lookup = "java:global/addressDatabase")
   private String addressDatabasePath;

   private CustomerDataModel dataModel = null;

   public StartupBean() {

   }

   @PostConstruct
   private void startup() {
       File customerDatabase = new File(customerDatabasePath);
       File addressDatabase = new File(addressDatabasePath);

       dataModel = new DataModelImpl(customerDatabase, addressDatabase);
   }

   @PreDestroy
   private void shutdown() {

   }

   public CustomerDataModel getDataModel() {
       return dataModel;
   }
}

这是我的vaadin类需要一个完全初始化的启动bean

@DependsOn("StartupBean")
@Stateless
public class Workspace extends UI {
   @EJB
   private StartupBean startupBean;

   @WebServlet(value = "/*", asyncSupported = true)
   @VaadinServletConfiguration(productionMode = false, ui = Workspace.class)
   public static class Servlet extends VaadinServlet {
   }

   @Override
   protected void init(VaadinRequest request) {
   if(startupBean == null) {
      System.out.println("error");
   }

我用@EJB和@Inject尝试了它,但都不起作用。我总是在startupBean上得到一个nullpointer。我在WEB-INF

上也有一个bean.xml

我根据http://java.dzone.com/articles/cdi-di-p1http://docs.oracle.com/javaee/6/tutorial/doc/gipvi.html

进行了尝试

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是您的Workspace对象(扩展Vaadin UI)不能是无状态EJB。其中一个实例由一个用户使用。相反,您应该开始使用Vaadin CDI并使用@CDIUI进行注释。然后,您可以将EJB注入您的CDI托管(〜会话作用域)Vaadin UI。