Я хотел бы вставить сессионный CDI-компонент в не имеющий аналогов EJB. При времени доступа EJB следует использовать правильный экземпляр сеансового бита cdi (т. Е. Тот, который используется в сеансовом сеансе вызывающего абонента). Я знаю, что я могу решить это с помощью EJB, но мне бы очень хотелось узнать, разрешено ли это с CDI. Поскольку EJB и Servlet работают в одной и той же войне, я бы предположил, что они имеют один и тот же поток, и контейнер должен быть в состоянии определить правильный сеансовый компонент в EJB?Inject @SessionScoped CDI Bean для @Stateless 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;
}
}
КДИ Бин:
@SessionScoped
public class SessionData implements Serializable {
String uuid;
Date creationDate;
public SessionData() {
uuid = UUID.randomUUID().toString();
creationDate = new Date();
}
}
Когда я теперь получить доступ без гражданства EJB, например, из сервлета я бы хотел, чтобы testMethod использовал компонент CDI, который связан с HTTPSession вызывающего. Поэтому, если два клиента из разных сеансов браузера/http обращаются к сервлету, они должны получать разные строки результата.
Нужно ли мне CDI Provider
вместо Instance
, и если да, то каким образом я могу создать правильный экземпляр компонента для данного сеанса? Я думал о том, чтобы получить BeanManager и искать экземпляры SessionData, но я не знаю, как бы получить правильный.
Любая помощь с благодарностью, спасибо!
вы не сказали, что произошло, когда вы пытались ваш код. –
Какой сервер приложений или Реализация CDI вы используете? Я рекомендую добавить тег. –
@bkail Я использую gl asfish 4 и afaik это сварка ... Я добавил теги – Korgen