Я хотел бы внедрить bean-компонент CDI с ограниченным сеансом в EJB-компонент без сохранения состояния. Во время доступа к EJB должен использоваться правильный экземпляр bean-компонента cdi с областью сеанса (т. Е. Тот, который находится в области действия вызывающего объекта). Я знаю, что могу решить эту проблему с помощью EJB с отслеживанием состояния, однако мне бы очень хотелось знать, можно ли это решить и с помощью CDI. Поскольку EJB и сервлет работают в одной и той же войне, я предполагаю, что они используют один и тот же поток, и контейнер должен иметь возможность определить правильный bean-компонент с сессией в EJB?
Например:
EJB:
@Stateless
@LocalBean
public class StatelessSessionBean {
@Inject
Instance<SessionData> sessionData;
public String testMethod() {
SessionData bean = sessionData.get();
String result = "Retrieved bean " + bean + " with UUID "+ bean.uuid + ". Created on: " + new SimpleDateFormat("dd.MM.yyyy HH:mm").format(bean.creationDate);
return result;
}
}
Компонент CDI:
@SessionScoped
public class SessionData implements Serializable {
String uuid;
Date creationDate;
public SessionData() {
uuid = UUID.randomUUID().toString();
creationDate = new Date();
}
}
Когда я теперь получаю доступ к EJB без сохранения состояния, например из сервлета, я бы хотел, чтобы testMethod использовал bean-компонент CDI, связанный с HTTPSession вызывающего. Поэтому, если два клиента из разных сеансов браузера / http обращаются к сервлету, они оба должны получить разные строки результатов.
Нужен ли мне CDI Provider
вместо Instance
, и если да, как мне создать правильный экземпляр bean-компонента для данного сеанса? Я думал о том, чтобы получить BeanManager и поискать экземпляры SessionData, но не знаю, как получить правильный.
Любая помощь приветствуется, спасибо!
@SessionScoped
cdi в@Stateless
EJB-компонент,@Stateless
EJB-компонент не смешивается, путать параметры сеанса, если мы достигаем их с помощью геттеров? 27.07.2017