2013-11-10 5 views
4

Я хотел бы вставить сессионный 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, но я не знаю, как бы получить правильный.

Любая помощь с благодарностью, спасибо!

+0

вы не сказали, что произошло, когда вы пытались ваш код. –

+0

Какой сервер приложений или Реализация CDI вы используете? Я рекомендую добавить тег. –

+0

@bkail Я использую gl asfish 4 и afaik это сварка ... Я добавил теги – Korgen

ответ

3

Хорошо, теперь я чувствую себя глупо :-(

Я обходя контекстный боб предоставленного прокси, не использующих геттеры/сеттеров для доступа к члену. Вместо этого я напрямую использовал пакет-частные поля который предотвращает прокси от предоставления правильного экземпляра.

Как только я перешел на геттеры/сеттеров он начал работать, как ожидалось.

+0

Итак, когда мы вставляем bean-компонент '@ SessionScoped' в компонент' @ Stateless' EJB, '@ Stateless' EJB bean не смешивается, путайте session-self параметры, если мы достигаем их с помощью геттеров? – mismanc

0

Инъекция долгоживущих бобовых областей в короткоживущие (в том числе зависящие от объема для EJB) работает из коробки благодаря client proxies.

См. Также соответствующий раздел в Weld reference manual.

+0

К сожалению, я не могу подтвердить это ... если я просто использую @Inject (без экземпляра ) и получить доступ к нему из разных сеансов (т. е. браузеры) Я получаю другую ссылку прокси, но экземпляр компонента остается тем же (он имеет ту же дату создания и тот же UUID) – Korgen

+0

Это удивительно. Я собираюсь дать этому попробовать JBoss ... –

Смежные вопросы