Nano Hash - криптовалюты, майнинг, программирование

Внедрить @SessionScoped CDI Bean в @Stateless EJB

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

Любая помощь приветствуется, спасибо!


  • Вы не сказали, что произошло, когда попробовали свой код. 10.11.2013
  • Какой сервер приложений или реализацию CDI вы используете? Рекомендую добавить тег. 11.11.2013
  • @bkail Я использую glasfish 4 и afaik это сварка ... Я добавил теги 11.11.2013
  • @JBNizet Я должен быть более конкретным: я получаю другую ссылку, но всегда с тем же UUID и той же датой создания ... поэтому я думаю, что прокси другой, но используемый объект тот же 12.11.2013

Ответы:


1

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

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

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

14.11.2013
  • Итак, когда мы вводим bean-компонент @SessionScoped cdi в @Stateless EJB-компонент, @Stateless EJB-компонент не смешивается, путать параметры сеанса, если мы достигаем их с помощью геттеров? 27.07.2017

  • 2

    Внедрение долгоживущих областей видимости bean-компонентов в краткосрочные (включая зависимую область действия для EJB-компонентов) работает из коробки благодаря клиентские прокси.

    См. Также соответствующий раздел в справочном руководстве по сварке .

    12.11.2013
  • К сожалению, я не могу это подтвердить ... если я просто использую @Inject (без экземпляра ‹SessionData›) и получаю к нему доступ из разных сеансов (то есть браузеров), я получаю другую ссылку на прокси, но экземпляр компонента остается тем же (он имеет ту же дату создания и тот же UUID) 13.11.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..