@EJB и @Inject не работают для моего класса vaadin

Я пытаюсь внедрить свой одноэлементный стартовый компонент, который инициализирует CustomerDataModel, в класс vaadin.

@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, которому нужен полностью инициализированный стартовый компонент

@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, ничего не работает. Я всегда получаю нулевой указатель при запускеBean. У меня также есть bean.xml в WEB-INF

я попробовал это в соответствии с http://java.dzone.com/articles/cdi-di-p1 и http://docs.oracle.com/javaee/6/tutorial/doc/gipvi.html

Кто-нибудь знает, что я делаю неправильно?


person Ben1980    schedule 03.04.2015    source источник
comment
Пожалуйста, покажите трассировку стека ошибок   -  person Alexander Fedyukov    schedule 03.04.2015
comment
Трассировки стека нет, потому что нет ошибки от EJB. Он просто не внедряет startbean, который тогда просто равен нулю.   -  person Ben1980    schedule 03.04.2015
comment
Можете ли вы показать, как вы проверяете ноль?   -  person Alexander Fedyukov    schedule 03.04.2015
comment
извините там, где отсутствует исходный код.   -  person Ben1980    schedule 03.04.2015
comment
Это только временно для отладки. Но что меня беспокоит, так это то, что инъекция, кажется, не работает. Я запускал его под wildfly и tomcat.   -  person Ben1980    schedule 03.04.2015
comment
Попробуйте упростить свой код и проверьте наличие ошибок. Сервлет как внутренний класс для меня незнаком, но может быть возможен.   -  person Alexander Fedyukov    schedule 04.04.2015
comment
Хорошо, насколько я знаю, это стандартный способ vaadin. Я не очень разбираюсь в Java EE   -  person Ben1980    schedule 04.04.2015
comment
На самом деле все, что я хочу сделать, это инициализировать модель данных только один раз, чтобы это не происходило каждый раз, когда пользователь вызывает Workspace. Я думал о синглтонном стартапе, но мне как-то нужен доступ к нему, поэтому я подумал об этом. У вас может быть лучшая идея сделать это?   -  person Ben1980    schedule 04.04.2015


Ответы (1)


Проблема в том, что ваш объект Workspace (расширяет пользовательский интерфейс Vaadin) не может быть EJB без сохранения состояния. Один из них используется одним пользователем. Вместо этого вы должны начать использовать Vaadin CDI и аннотировать его с помощью @CDIUI. Затем вы можете внедрить EJB в ваш управляемый CDI (~ область сеанса) пользовательский интерфейс Vaadin.

person mstahv    schedule 04.04.2015
comment
Спасибо за подсказку, я попробовал, но теперь я получаю следующую ошибку от wildfly 8.2: - person Ben1980; 07.04.2015
comment
хм, смотри мой ответ выше - person Ben1980; 07.04.2015