У меня есть корпоративное приложение с (как минимум) веб-уровнем (только пользовательский интерфейс) и уровнем обслуживания. На сервисном уровне вся бизнес-логика и текущее состояние диалога реализованы в виде @Stateful @LocalBean
EJB (без CDI).
Это немного похоже на бин @SessionScoped
с точки зрения CDI, верно?
Итак, вот проблема:
У меня длительный разговор на веб-уровне (@Named @ConversationScoped
) и я хочу получить доступ к Stateful EJB. EJB должен быть доступен в разных контроллерах (бинах) этого диалога. Я не могу сделать это так: @EJB
, потому что это будет другой экземпляр определенного типа EJB. Я должен как-то сохранить ссылку на EJB. Это мое текущее решение:
@EJB
private MyEJB _myEJB; // a stateful EJB
@Produces
@Builder // custom quallifier
@ConversationScoped
public MyEJB produceMyEJB() {
return _myEJB;
}
Теперь я могу получить доступ к одному и тому же экземпляру EJB с состоянием в каждом из контроллеров области диалога, как это @Inject @Builder MyEJB _myEJB
.
Это работает, большую часть времени. Но в некоторых длительных тестах эта ссылка нулевая, и я не знаю почему.
Я получаю эту трассировку стека в server.log Glassfish:
javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key:
907f0200001f-ffffffffc3388fbb-761
и / или
Cannot load from BACKUPSTORE FOR Key: <907f0200001f-ffffffffc3388fbb-761>
У вас есть идеи, почему это происходит? Спасибо за помощь и извините за мой плохой английский.